我正在尝试做一些非常简单的事情:
1)将UIImage绘制到CG位图上下文
2)获取指向图像数据的指针
3)迭代所有像素并将所有R G B组件设置为0,将alpha设置为255.结果应该显示为纯黑色。
这是我正在使用的原始图像。 200 x 40像素,PNG-24 ARGB预乘alpha(所有alpha值== 255):
这是结果(来自Simulator的截图),当我不修改像素时。看起来不错:
这是我做修改时的结果!看起来修改是不完整的。但for循环遍及每个像素。计数器证明了这一点:控制台报告modifiedPixels = 8000,正好是200 x 40像素。它看起来总是完全一样。
注意:我使用的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];
我做错了什么?
这是否发生是因为我在迭代时修改了数据?我必须复制吗?
答案 0 :(得分:1)
你可能会得到错误的高度或宽度....顺便说一下240x40 = 9600而不是8000,所以你肯定没有迭代每个像素。
答案 1 :(得分:1)
使用CGBitmapContextGetBytesPerRow(bitmapContext)获取bytesPerRow而不是从图像获取(如果图像没有alpha信息,则每个像素只有3个字节)