【发布时间】:2016-03-08 03:34:05
【问题描述】:
我已经通过使用不同的代码解决了我的问题。我只是想知道下面这个有什么问题?
我想使用位图数据更改UIImage 中每个像素的颜色。我的代码如下:
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
UIImage *image = self.imageViewMain.image;
CGImageRef imageRef = image.CGImage;
NSData *data = (NSData *)CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(imageRef)));
char *pixels = (char *)[data bytes];
// this is where we manipulate the individual pixels
for(int i = 1; i < [data length]; i += 3)
{
int r = i;
int g = i+1;
int b = i+2;
int a = i+3;
pixels[r] = 0; // eg. remove red
pixels[g] = pixels[g];
pixels[b] = pixels[b];
pixels[a] = pixels[a];
}
// create a new image from the modified pixel data
size_t width = CGImageGetWidth(imageRef);
size_t height = CGImageGetHeight(imageRef);
size_t bitsPerComponent = CGImageGetBitsPerComponent(imageRef);
size_t bitsPerPixel = CGImageGetBitsPerPixel(imageRef);
size_t bytesPerRow = CGImageGetBytesPerRow(imageRef);
CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
CGBitmapInfo bitmapInfo = CGImageGetBitmapInfo(imageRef);
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, [data length], NULL);
CGImageRef newImageRef = CGImageCreate (
width,
height,
bitsPerComponent,
bitsPerPixel,
bytesPerRow,
colorspace,
bitmapInfo,
provider,
NULL,
false,
kCGRenderingIntentDefault
);
// the modified image
UIImage *newImage = [UIImage imageWithCGImage:newImageRef];
// cleanup
free(pixels);
CGImageRelease(imageRef);
CGColorSpaceRelease(colorspace);
CGDataProviderRelease(provider);
CGImageRelease(newImageRef);
}
但是当这段代码运行时 - 我得到EXC_BAD_ACCESS error 如下图所示:
这里还有一些来自调试的更多信息:
我错过了什么或做错了什么?
【问题讨论】:
-
我不认为你应该改变从
[data bytes]得到的数组 -
@dan :好的,但是为什么我们不能,它只是一个数组。不是 NSArray 对象?
-
这是一个支持不可变对象的数组。它也被声明为
const。如果要修改它,请使用NSMutableData上的mutableBytes方法 -
@dan : 明白了.. 你能回答我吗?
标签: ios objective-c uiimage core-graphics