Objective-C:将浮点数组显示为图像

时间:2012-02-02 19:48:32

标签: objective-c nsdata nsimageview

在Cocoa应用程序中,我想在NSImageView中显示一个2d浮点数组。为了使代码尽可能简单,首先将数据从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实现这一目标。

我已经注意到之前的Stack帖子:32 bit dataclose but in reversealmost worked but no NSDatacolor image data here,但运气不足以获得变化。感谢您的任何建议。

2 个答案:

答案 0 :(得分:2)

您可以使用NSBitmapImageRep来构建NSImage float-by-float。

有趣的是,其中一个初始化程序在所有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包含正确的位图格式之一。

答案 1 :(得分:0)

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