如何使用CoreGraphics对图像原始数据进行计算?

时间:2012-02-19 02:28:15

标签: ios image-processing filter core-graphics quartz-2d

我正在尝试为iOS上的图片创建特定的自定义滤镜效果。到目前为止,我一直在尝试使用CGBitmapContextCreate获取原始数据。但是,我真的不知道如何修改我的rawData。我希望对它进行计算。我希望用rawData逐个像素地生效,但我不知道如何操作它。

我也不知道如何将我的位图上下文绘制到UIImage,因此我可以在UIImageView上渲染完成的产品。

有人可以给我一些指示,告诉我如何实现这个目标吗?

到目前为止,这是我的代码:

// First get the image into your data buffer
CGImageRef imageRef = imageView.image.CGImage;
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = calloc(height * width * 4, sizeof(unsigned char));
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
                                             bitsPerComponent, bytesPerRow, colorSpace,
                                             kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);

//perform calculations on rawData? or context? not sure!! i hope to effect pixel by pixel.


//am i doing this correctly?
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//set the imageview with the new image
[imageView setImage:newImage];
CGContextRelease(context);

1 个答案:

答案 0 :(得分:0)

你快到了。 您可以通过以下方式在RGB和Alpha通道上执行交易:

for (NSUInteger i = 0 ; i < rawDataSpace ; i+=4) {
        rawData[i+0] = ...              
        rawData[i+1] = ...            
        rawData[i+2] = ...             
        rawData[i+3] = ...       // = Alpha channel