- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试在后台线程中更改图像的颜色。
Apple 文档说 UIGraphicsBeginImageContext 只能从主线程调用,我正在尝试使用 CGBitmapContextCreate:
context = CGBitmapContextCreate (bitmapData, pixelsWide, pixelsHigh, 8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
我有两个版本的“changeColor”,第一个使用 UIGraphisBeginImageContext,第二个使用 CGBitmapContextCreate。
第一个正确地改变了颜色,但第二个没有。
这是为什么?
- (UIImage*) changeColor: (UIColor*) aColor
{
if(aColor == nil)
return self;
UIGraphicsBeginImageContext(self.size);
CGRect bounds;
bounds.origin = CGPointMake(0,0);
bounds.size = self.size;
[aColor set];
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(context, 0, self.size.height);
CGContextScaleCTM(context, 1.0, -1.0);
CGContextClipToMask(context, bounds, [self CGImage]);
CGContextFillRect(context, bounds);
UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return img;
}
- (UIImage*) changeColor: (UIColor*) aColor
{
if(aColor == nil)
return self;
CGContextRef context = CreateARGBBitmapContext(self.size);
CGRect bounds;
bounds.origin = CGPointMake(0,0);
bounds.size = self.size;
CGColorRef colorRef = aColor.CGColor;
const CGFloat *components = CGColorGetComponents(colorRef);
float red = components[0];
float green = components[1];
float blue = components[2];
CGContextSetRGBFillColor(context, red, green, blue, 1);
CGContextClipToMask(context, bounds, [self CGImage]);
CGContextFillRect(context, bounds);
CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage* img = [UIImage imageWithCGImage: imageRef];
unsigned char* data = (unsigned char*)CGBitmapContextGetData (context);
CGContextRelease(context);
free(data);
return img;
}
CGContextRef CreateARGBBitmapContext(CGSize size)
{
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;
// Get image width, height. We'll use the entire image.
size_t pixelsWide = size.width;
size_t pixelsHigh = size.height;
// Declare the number of bytes per row. Each pixel in the bitmap in this
// example is represented by 4 bytes; 8 bits each of red, green, blue, and
// alpha.
bitmapBytesPerRow = (pixelsWide * 4);
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
// Use the generic RGB color space.
colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL)
{
fprintf(stderr, "Error allocating color space\n");
return NULL;
}
// Allocate memory for image data. This is the destination in memory
// where any drawing to the bitmap context will be rendered.
bitmapData = malloc( bitmapByteCount );
if (bitmapData == NULL)
{
fprintf (stderr, "Memory not allocated!");
CGColorSpaceRelease( colorSpace );
return NULL;
}
// Create the bitmap context. We want pre-multiplied ARGB, 8-bits
// per component. Regardless of what the source image format is
// (CMYK, Grayscale, and so on) it will be converted over to the format
// specified here by CGBitmapContextCreate.
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,
8, // bits per component
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
if (context == NULL)
{
free (bitmapData);
fprintf (stderr, "Context not created!");
}
// Make sure and release colorspace before returning
CGColorSpaceRelease( colorSpace );
return context;
}
最佳答案
您的第二种方法是做第一种方法从未做过的工作。下面是对第二种方法的调整,以更接近第一种方法:
- (UIImage*) changeColor: (UIColor*) aColor
{
if(aColor == nil)
return self;
CGContextRef context = CreateARGBBitmapContext(self.size);
CGRect bounds;
bounds.origin = CGPointMake(0,0);
bounds.size = self.size;
CGContextSetFillColorWithColor(aColor.CGColor);
CGContextClipToMask(context, bounds, [self CGImage]);
CGContextFillRect(context, bounds);
CGImageRef imageRef = CGBitmapContextCreateImage(context);
UIImage* img = [UIImage imageWithCGImage: imageRef];
CGContextRelease(context);
return img;
}
我所做的两个更改是我将其转换为使用 CGContextSetFillColorWithColor()
,并且我删除了位图上下文的支持数据的危险且不正确的 free()
.如果此代码片段的行为与第一个代码片段不同,则您必须查看 CreateARGBBitmapContext()
的实现以验证它是否正确。
当然,正如 Brad Larson 在评论中提到的,如果您的目标是 iOS 4.0 及更高版本,UIKit 图形方法(根据发行说明)是线程安全的,您应该能够使用第一种方法很好。
关于ios - UIGraphicsBeginImageContext 与 CGBitmapContextCreate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4683448/
我正在我的应用程序中截取屏幕截图。我可以截图。 现在我想通过指定 x 和 y 坐标来截取屏幕截图。这可能吗? UIGraphicsBeginImageContext( self.view.bounds
我正在使用这种方法来压缩UIImage if (actualHeight > maxHeight || actualWidth > maxWidth) { if(imgRati
所以我一直认为 UIGraphicsBeginImageContext 是线程安全的,可以从任何线程调用以创建可用于绘制的新 CGContextRef。 但是,当前documentation指出 “您
我现在正在为 Mac OSX 创建一个 iOS 应用程序。我有下面的代码将图像转换为 1024 的大小,并根据图像的纵横比计算出宽度。这适用于 iOS,但显然不适用于 OSX。我不确定如何创建 NSI
我正在尝试附加从 UIGraphicsBeginImageContext 渲染的图像。作为测试,我也将图像添加到相册中。这一切在模拟器上都能完美运行,但在设备上,正确的图像会添加到相册中,但不会正确显
我想经常在我的 View 中画线,但它不起作用。我不想使用drawRect,因为我还必须维护之前绘制的线的状态。下面是画线的代码。请指导。 - (void)drawPathWithPoints:(in
所以我一直认为 UIGraphicsBeginImageContext 是线程安全的,可以从任何线程调用以创建可用于绘制的新 CGContextRef。 但是,当前documentation指出 “您
我想在图像中捕获当前屏幕。我这样做: UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, self.view.isOpaque,
我正在尝试生成图像,并在 Apple 文档中发现 UIGraphicsBeginImageContext() 看起来很完美。我一直在看一些 Quartz 教程,在每个教程中,他们都使用自定义 View
我有代码可以让我在 UIImageView 上绘图 - 但我希望能够限制绘图区域。 我已经能够限制大小,但现在我无法定位它:如果我将 (0, 0) 更改为任何其他值,我的图像将完全消失并且绘图功能将停
我尝试一次对超过 100 个 UIimage 进行图像裁剪和羽化。但是在iPhone6上运行时总是会出现内存问题。 Memory Leak checking by Instrucment 这是代码。我
我有一个简单的函数来创建一个特殊尺寸的 UIImage : - (UIImage*)imageWithSize:(CGSize) imSize { UIGraphicsBeginImageCo
我正在尝试在后台线程中更改图像的颜色。 Apple 文档说 UIGraphicsBeginImageContext 只能从主线程调用,我正在尝试使用 CGBitmapContextCreate: co
我在执行下面的代码时遇到了这些错误: [Switching to process 74682 thread 0x2003] [Switching to process 74682 thread 0x2
我正在用 UIGraphicsImageRendererFormat 替换 UIGraphicsBeginImageContext 以优化性能并使我的代码现代化。出于某种原因,UIGraphicsIm
在我的代码中,我将图像的大小拉伸(stretch)到指定的大小。到目前为止,代码工作正常。我遇到的问题是“UIGraphicsBeginImageContext ()”没有释放新图像的内存。因此,大约
我读过一些推荐使用的帖子: UIGraphicsBeginImageContextWithOptions((image.size), NO, 0.0f) 代替: UIGraphicsBeginImag
我是 iOS API 这些部分的新手,这里有一些问题在我脑海中造成无限循环 为什么 ..BeginImageContext 有大小而 ..GetCurrentContext 没有大小?如果 ..Get
我想在 UIImage 上画一些线。我能够将线条绘制到上下文中,最后我在使用以下代码从上下文中获取图像之前绘制背景图像: UIGraphicsBeginImageContext(self.bounds
我正在使用 UIGraphicsBeginImageContext 捕获屏幕,但图像质量不佳。任何人都可以帮助我如何将 UICollectionViewCell 保存为高质量图像以及如何在选择单元格时
我是一名优秀的程序员,十分优秀!