Я работаю над OSX-приложением, которое делает некоторые манипуляции с изображениями на уровне пикселей. Я использую следующий код для доступа к компонентам пиксельных цветов (RGBA) в качестве обычных байтов в качестве указателей uint8.Доступ к CGImageRef для базовых байтов и изменения?
NSImage *image = self.iv.image;
NSRect imageRect = NSMakeRect(0, 0, image.size.width, image.size.height);
CGImageRef cgImage = [image CGImageForProposedRect:&imageRect context:NULL hints:nil];
NSData *data = (NSData *)CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(cgImage)));
uint8 *pixels = (uint8 *)[data bytes];
В этот момент я применить некоторые изменения уровня байт:
for (int i = 0; i < [data length]; i += 4) { ... }
Изменение этой области памяти не оказывает какого-либо воздействия на первоначальную CGImageRef
(который в то время отображается в NSImageView
). Я должен сделать следующее, чтобы увидеть обновления изображения соответственно:
CGImageRef newImageRef = CGImageCreate (width,
height,
bitsPerComponent,
bitsPerPixel,
bytesPerRow,
colorspace,
bitmapInfo,
provider,
NULL,
false,
kCGRenderingIntentDefault);
NSSize size = NSMakeSize(CGImageGetWidth(newImageRef),
CGImageGetHeight(newImageRef));
NSImage * newIm = [[NSImage alloc] initWithCGImage:newImageRef size:size];
self.iv.image = newIm;
Другими словами, байты, которые я получаю обратно изменить только копию исходных байтов, предположительно, в результате CGDataProviderCopyData(CGImageGetDataProvider(cgImage)
.
Мой вопрос заключается в следующем. Есть ли способ напрямую обращаться к базовым байтам CGImageRef, так что когда я их модифицирую, изображение обновляется на экране, когда я ими манипулирую?