4

在 Cocoa 应用程序中,我想在 NSImageView 中显示一个二维浮点数组。为了使代码尽可能简单,首先将数据从 float 转换为 NSData:

// dataArray: an Nx by Ny array of floats
NSMutableData *nsdata = [NSMutableData dataWithCapacity:0];
long numPixels = Nx*Ny;
for (int i = 0; i < numPixels; i++) {
    [nsdata appendBytes:&dataArray[i] length:sizeof(float)];
}

现在尝试显示数据(显示为空白):

[theNSImageView setImage:[[NSImage alloc] initWithData:nsdata]];

这是正确的方法吗?首先需要一个 CGContext 吗?我希望通过 NSData 来实现这一点。

我已经注意到早期的堆栈帖子:32 位数据关闭但反向几乎可以工作,但没有 NSData这里的彩色图像数据,但在这些工作上获得变化并没有太多运气。感谢您的任何建议。

4

2 回答 2

2

您可以使用 anNSBitmapImageRep来构建一个NSImage浮点数。

有趣的是,它的初始化器之一在所有 Cocoa 中具有最长的方法名称:

- (id)initWithBitmapDataPlanes:(unsigned char **)planes 
                    pixelsWide:(NSInteger)width 
                    pixelsHigh:(NSInteger)height 
                 bitsPerSample:(NSInteger)bps 
               samplesPerPixel:(NSInteger)spp 
                      hasAlpha:(BOOL)alpha 
                      isPlanar:(BOOL)isPlanar 
                colorSpaceName:(NSString *)colorSpaceName 
                  bitmapFormat:(NSBitmapFormat)bitmapFormat 
                   bytesPerRow:(NSInteger)rowBytes 
                  bitsPerPixel:(NSInteger)

至少有据可查。一旦你通过提供浮点数组来构建它,planes你就可以将NSImage它放在你的视图中:

NSImage *image = [[NSImage alloc] initWithCGImage:[bitmapImageRep CGImage] size:NSMakeSize(width,height)];

或者,稍微清洁一点

NSImage *image = [[[NSImage alloc] init] autorelease];
[im addRepresentation:bitmapImageRep];

有一个只使用NSData容器的初始化程序:

+ (id)imageRepWithData:(NSData *)bitmapData

尽管这取决于您bitmapData包含正确的位图格式之一。

于 2012-02-02T21:33:59.700 回答
0

好的,让它工作。我之前尝试过 NSBitmapImageRep(感谢 Tim),但我缺少的部分是将浮点数据正确转换为字节数组。NSData 不这样做并返回 nil。所以解决方案不是需要建立一个 NSImage 浮点数。事实上,可以类似地建立一个 bitmapContext(使用 CGBitmapContextCreate(由上面的 HotLicks 提到)),一旦浮点数据被正确表示,它也可以工作。

于 2012-02-04T17:33:50.030 回答