在iPhone上读取和编辑图像像素

时间:2010-12-05 07:58:19

标签: iphone uiimageview uiimage core-graphics quartz-graphics

对如何在iPhone上阅读和编辑图片的像素感到好奇。我最好使用带颜色的点阵列吗?

我想做的事情是......如果CGPoint与图片上的“棕色”点相交,则将半径内所有棕色像素的颜色设置为白色。还有更多问题,但这是一个开始。

干杯

1 个答案:

答案 0 :(得分:1)

图像数据可以精确地用于 - 二维像素阵列,每个像素由32位整数表示。对于每个颜色分量(红色,绿色,蓝色和alpga),存在8位值。这些8位宽的值在32位整数内的排序随图像数据的格式而变化。关于这一切的苹果博士真的很棒。虽然有一些有吸引力的苹果公司使用CGDataProviderCopyData来指示UIImage的实际数据存储,实际上这可能是一个令人头疼的问题,因为内部存储的格式可能因图像而异。在实践中,大多数进行图像处理的人似乎都使用这种方法:

    CGImageRef image = [UIImage CGImage];
    NSUInteger width = CGImageGetWidth(image);
    NSUInteger height = CGImageGetHeight(image);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    unsigned char *rawData_ = malloc(height * width * 4);
    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));
    CGContextRelease(context);

    //  rawData contains image data in the RGBA8888 format.

    // for any pixel at coordinate x,y -- the value is
    // 

    int pixelIndex = (bytesPerRow * y) + x * bytesPerPixel;
    unsigned char red = rawData[pixelIndex];
    green = rawData[pixelIndex + 1];
    blue = rawData[pixelIndex + 2];
    alpha = rawData[pixelIndex + 3];