CoreGraphics Pixel Manipulation Синий - PullRequest
1 голос
/ 31 мая 2011

Я манипулирую пикселями, чтобы повернуть оттенки серого, и все выглядит хорошо, за исключением нижней части изображения, у меня есть пиксели синего цвета.Это тем больше, чем меньше размеры изображения, и исчезает после определенной точки.Кто-нибудь может увидеть, что я делаю не так?

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

Ответы [ 2 ]

1 голос
/ 01 июня 2011

Проблема в том, что я предполагаю CGImageGetWidth(imageRef) == CGImageGetBytesPerRow(imageRef) - что не всегда так.Это было указано мне на форумах разработчиков Apple, и это правильно.Я изменил использование длины данных и теперь работает как положено.

NSUInteger length = CFDataGetLength(dataref);
1 голос
/ 01 июня 2011

Есть причина, по которой никто не ответил - код, размещенный в вашем вопросе, кажется абсолютно нормальным!

Я сделал тестовый проект здесь: https://github.com/oneblacksock/stack_overflow_answer_6188863, и когда я запускаю его с вашим кодом, он отлично работает!

Единственными битами, которые отличаются от вашей проблемы, являются функции CopyPixelData и функции зажима - возможно, ваша проблема в них?

Загрузите мой тестовый проект и посмотрите, что я сделал - попробуйте его с изображением, которое, как вы знаете, сломано, и дайте мне знать, как вы поживаете!

Sam

...