【发布时间】:2016-11-01 08:33:28
【问题描述】:
我正在开发一个进行像素级图像处理的 OSX 应用程序。我正在使用以下代码将像素颜色分量 (RGBA) 作为常规字节转换为 uint8 指针。
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 的底层字节,这样当我修改它们时,图像会在我操作它们时在屏幕上更新?
【问题讨论】:
标签: macos image-processing core-graphics cgimage