CoreGraphics 像素操作蓝色

问题描述 投票:0回答:2

我正在操纵像素来转动灰度,一切都显示得很好,除了图像底部有蓝色像素。图像的尺寸越小,这种现象就显得越明显,并且在某一点之后消失。谁能看到我做错了什么吗?

CGImageRef imageRef = image.CGImage;

NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CFDataRef dataref = CopyImagePixels(imageRef);

unsigned char *rawData = (unsigned char *)CFDataGetBytePtr(dataref);

int byteIndex = 0;

for (int ii = 0 ; ii < width * height ; ++ii)

{

   int red = (int)rawData[byteIndex];
   int blue = (int)rawData[byteIndex+1]; 
   int green = (int)rawData[byteIndex+2];

   int r, g, b;

   r = (int)(red * 0.30) + (green * 0.59) + (blue * 0.11);
   g = (int)(red * 0.30) + (green * 0.59) + (blue * 0.11);
   b = (int)(red * 0.30) + (green * 0.59) + (blue * 0.11);


   rawData[byteIndex] = clamp(r, 0, 255);
   rawData[byteIndex+1] = clamp(g, 0, 255);
   rawData[byteIndex+2] = clamp(b, 0, 255);
   rawData[byteIndex+3] = 255;

   byteIndex += 4;

}



CGContextRef ctx = CGBitmapContextCreate(rawData,
                                        CGImageGetWidth(imageRef),
                                        CGImageGetHeight(imageRef),
                                        CGImageGetBitsPerComponent(imageRef),
                                        CGImageGetBytesPerRow(imageRef),
                                        CGImageGetColorSpace(imageRef),
                                        kCGImageAlphaPremultipliedLast); 


imageRef = CGBitmapContextCreateImage (ctx);
CFRelease(dataref);
UIImage* rawImage = [UIImage imageWithCGImage:imageRef];  
CGImageRelease(imageRef);
CGContextRelease(ctx);

问题示例:http://iforce.co.nz/i/3rei1wba.utm.jpg

iphone objective-c core-graphics pixel
2个回答
1
投票

没有人回答是有原因的 - 您问题中发布的代码看起来绝对没问题!

我在这里做了一个测试项目:https://github.com/oneblacksock/stack_overflow_answer_6188863当我用你的代码运行它时,它运行得很好!

与您的问题不同的唯一位是 CopyPixelData 和钳位函数 - 也许您的问题就在这些?

下载我的测试项目并看看我做了什么 - 使用您知道已损坏的图像进行尝试,并让我知道您的进展如何!

山姆


1
投票

问题是我假设 CGImageGetWidth(imageRef) == CGImageGetBytesPerRow(imageRef) - 但情况并非总是如此。这是在苹果开发者论坛上向我指出的,并且是正确的。我已更改为使用 dataref 的长度,现在它按预期工作。

NSUInteger length = CFDataGetLength(dataref);
© www.soinside.com 2019 - 2024. All rights reserved.