Ich arbeite an einer OSX-App, die Bildbearbeitung auf Pixelebene durchführt. Ich verwende den folgenden Code, um auf die Pixel-Farbkomponenten (RGBA) als reguläre Bytes zuzugreifen, die als uint8-Zeiger umgewandelt werden.Zugriff auf CGImageRef zugrunde liegenden Bytes und ändern?
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];
An diesem Punkt wende ich einige Byte-Ebene Änderungen:
for (int i = 0; i < [data length]; i += 4) { ... }
diesen Bereich des Speichers ändern scheint keine Auswirkungen auf die ursprünglichen CGImageRef
zu haben (die zu der Zeit in eine angezeigte NSImageView
). Ich muß die folgenden Punkte entsprechend das Bild Update zu sehen:
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;
Mit anderen Worten, die Bytes ich zurück zu modifizieren, ist nur eine Kopie des ursprünglichen Bytes, vermutlich als Folge von CGDataProviderCopyData(CGImageGetDataProvider(cgImage)
.
Meine Frage ist wie folgt. Gibt es eine Möglichkeit, auf die zugrunde liegenden Bytes von CGImageRef direkt zuzugreifen, so dass das Bild bei der Änderung auf dem Bildschirm aktualisiert wird, wenn ich sie manipuliere?