Как выполнить вычисления на необработанных данных изображения с CoreGraphics? - PullRequest
0 голосов
/ 19 февраля 2012

Я пытаюсь создать специальные пользовательские эффекты фильтра для изображения для iOS.До сих пор я пытался получить необработанные данные, используя CGBitmapContextCreate.Тем не менее, я не имею ни малейшего представления о том, как изменить мои rawData.Я надеюсь выполнить вычисления на этом.Я надеюсь обработать пиксель за пикселем с помощью rawData, но я не знаю, как им манипулировать.

Я также не знаю, как я могу нарисовать свой растровый контекст в UIImage, чтобы я мог отобразить готовый продуктна UIImageView.

Может ли кто-нибудь дать мне несколько советов, как мне этого добиться?

Вот мой код:

// First get the image into your data buffer
CGImageRef imageRef = imageView.image.CGImage;
NSUInteger width = CGImageGetWidth(imageRef);
NSUInteger height = CGImageGetHeight(imageRef);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
unsigned char *rawData = calloc(height * width * 4, sizeof(unsigned char));
NSUInteger bytesPerPixel = 4;
NSUInteger bytesPerRow = bytesPerPixel * width;
NSUInteger bitsPerComponent = 8;
CGContextRef context = CGBitmapContextCreate(rawData, width, height,
                                             bitsPerComponent, bytesPerRow, colorSpace,
                                             kCGImageAlphaPremultipliedLast | kCGBitmapByteOrder32Big);
CGColorSpaceRelease(colorSpace);

CGContextDrawImage(context, CGRectMake(0, 0, width, height), imageRef);

//perform calculations on rawData? or context? not sure!! i hope to effect pixel by pixel.


//am i doing this correctly?
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//set the imageview with the new image
[imageView setImage:newImage];
CGContextRelease(context);

1 Ответ

0 голосов
/ 01 июля 2012

Вы почти у цели. Вы можете совершать транзакции на каналах RGB и Alpha:

for (NSUInteger i = 0 ; i < rawDataSpace ; i+=4) {
        rawData[i+0] = ...              
        rawData[i+1] = ...            
        rawData[i+2] = ...             
        rawData[i+3] = ...       // = Alpha channel         
...