为什么在编辑图像时会得到这些奇怪的结果?

时间:2011-06-18 14:08:49

标签: iphone ios ipad memory-management core-graphics

我正在尝试做一些非常简单的事情:

1)将UIImage绘制到CG位图上下文

2)获取指向图像数据的指针

3)迭代所有像素并将所有R G B组件设置为0,将alpha设置为255.结果应该显示为纯黑色。


这是我正在使用的原始图像。 200 x 40像素,PNG-24 ARGB预乘alpha(所有alpha值== 255):

original


这是结果(来自Simulator的截图),当我不修改像素时。看起来不错:

unmodified result


这是我做修改时的结果!看起来修改是不完整的。但for循环遍及每个像素。计数器证明了这一点:控制台报告modifiedPixels = 8000,正好是200 x 40像素。它看起来总是完全一样。

modified result

注意:我使用的PNG图像没有alpha< 255.所以没有透明像素。


这是我创建上下文的方式。没什么特别的......

int bitmapBytesPerRow = (width * 4);
int bitmapByteCount = (bitmapBytesPerRow * imageHeight);

colorSpace = CGColorSpaceCreateDeviceRGB();

bitmapData = malloc(bitmapByteCount);
bitmapContext = CGBitmapContextCreate(bitmapData,
                width,
                height,
                8, // bits per component
                bitmapBytesPerRow,
                colorSpace,
                CGImageAlphaPremultipliedFirst);

接下来,我将图片绘制到bitmapContext,并获取如下数据:

void *data = CGBitmapContextGetData(bitmapContext);

这是迭代像素以修改它们的代码:

size_t bytesPerRow = CGImageGetBytesPerRow(img);

NSInteger modifiedPixels = 0;
for (int y = 0; y < height; y++) {
    for (int x = 0; x < width; x++) {
        long int offset = bytesPerRow * y + 4 * x;

        // ARGB
        unsigned char alpha = data[offset];
        unsigned char red = data[offset+1];
        unsigned char green = data[offset+2];
        unsigned char blue = data[offset+3];

        data[offset] = 255;
        data[offset+1] = 0;
        data[offset+2] = 0;
        data[offset+3] = 0;

        modifiedPixels++;
    }
}

完成后,我从位图上下文中获取一个新的UIImage并将其显示在UIImageView中,以查看结果:

CGImageRef imageRef = CGBitmapContextCreateImage(bitmapContext);
UIImage *img = [[UIImage alloc] initWithCGImage:imageRef];

问题:

我做错了什么?

这是否发生是因为我在迭代时修改了数据?我必须复制吗?

2 个答案:

答案 0 :(得分:1)

你可能会得到错误的高度或宽度....顺便说一下240x40 = 9600而不是8000,所以你肯定没有迭代每个像素。

答案 1 :(得分:1)

使用CGBitmapContextGetBytesPerRow(bitmapContext)获取bytesPerRow而不是从图像获取(如果图像没有alpha信息,则每个像素只有3个字节)