如何解决为什么在编辑图像时会得到这些奇怪的结果?
| 我正在尝试做一些非常简单的事情: 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);
接下来,我将图像绘制到ѭ1中,并获得如下数据:
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];
题:
我究竟做错了什么?
这是因为我在迭代数据时修改了数据吗?我必须复制吗?
解决方法
使用CGBitmapContextGetBytesPerRow(bitmapContext)来获取bytesPerRow而不是从图像获取(如果图像没有alpha信息,则每个像素只有3个字节)
, 可能是因为您输入的高度或宽度不正确。...而且顺便说一句240x40 = 9600而不是8000,这样可以确保您没有遍历每个像素。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。