4

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ビットデータ近いが逆ほとんど機能しましたが、NSDataはありません、ここにカラー画像データがありますが、これらの機能のバリエーションを得るのはあまり幸運ではありません。提案をありがとう。

4

2 に答える 2

2

を使用して、 float-by-floatNSBitmapImageRepを構築できます。NSImage

興味深いことに、そのイニシャライザーの1つは、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)

少なくとも十分に文書化されています。にfloat配列を指定して構築したら、ビューに配置する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つが含まれているかどうかによって異なります。

于 2012-02-02T21:33:59.700 に答える
0

OK、動作しました。以前にNSBitmapImageRepを試しましたが(Timに感謝)、浮動小数点データをバイト配列に適切に変換することができませんでした。NSDataはそれを行わず、nilを返します。したがって、ソリューションは、NSImageをfloat-by-floatで構築する必要はあまりありませんでした。実際、(CGBitmapContextCreate(上記のHotLicksで言及されている)CGBitmapContextCreateを使用して)bitmapContextを同様に構築でき、浮動小数点データが適切に表現されると、それも機能します。

于 2012-02-04T17:33:50.030 に答える