Objective-C: показать массив поплавков в виде изображения - PullRequest
4 голосов
/ 02 февраля 2012

В приложении Какао я хотел бы отобразить 2d массив с плавающей точкой в ​​NSImageView.Чтобы сделать код максимально простым, начните с преобразования данных из числа с плавающей запятой в 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 , данные цветного изображения здесь , но не так много удачи, получая вариации на эти работы.Спасибо за любые предложения.

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

Вы можете использовать NSBitmapImageRep для создания NSImage float-by-float.

Интересно, что один из его инициализаторов имеет самое длинное имя метода во всем Какао:

- (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, содержащего один из правильных растровых форматов.

0 голосов
/ 04 февраля 2012

Хорошо, получил его на работу. Я пробовал NSBitmapImageRep раньше (спасибо Тим), но часть, которую я пропустил, была в правильном преобразовании моих данных с плавающей запятой в байтовый массив. NSData не делает этого и возвращает ноль. Таким образом, решение было не столько в том, чтобы создавать NSImage float-by-float. Фактически, можно аналогичным образом создать bitmapContext (используя CGBitmapContextCreate (упомянутое выше в HotLicks)), и это тоже работает, если данные с плавающей запятой правильно представлены.

...