Плагин Photoshop с использованием Cocoa - Как получить предварительный просмотр

StackOverflow https://stackoverflow.com/questions/1166580

Вопрос

Я внедряю плагин Photoshop на Mac, и я делаю это с помощью Cocoa.Пока все в порядке, но следующий шаг - предоставить изображение "предварительного просмотра" как часть окна моего плагина, и я застрял.Я программист n00b Obj-C, что на самом деле не помогает :-)

Пока что у меня получилось что-то вроде этого:

int dataSize = gFilterRecord->bigDocumentData->wholeSize32.v *
               gFilterRecord->bigDocumentData->wholeSize32.h *
               gFilterRecord->planes; 

NSData *inData = [[NSData alloc] initWithBytesNoCopy:gFilterRecord->inData length:dataSize freeWhenDone:NO];
NSLog(@"LoadImageFromSDK : Data created");
NSImage *imageTmp = [[NSImage alloc] initWithData:inData];
NSLog(@"LoadImageFromSDK : Image created");

//Save to PNG file as a test of this image creation
[[imageTmp TIFFRepresentation] writeToFile:@"/tmp/imageTmp.tif" atomically:YES];
NSLog(@"LoadImageFromSDK : Wrote image to disk");

На данный момент он ужасно вылетает на:
07.09.22 10:23:32 УТРА Adobe Photoshop Elements[46628] *** Сбой NSCopyMemoryPages (0x0, 0x245f4000, 2265088)

Вероятно, я неправильно рассчитываю размер InData.Помочь?

Кроме того, сможет ли NSImage правильно интерпретировать этот блок данных изображения?Или я должен отказаться от этого и просто выполнить попиксельное отображение в NSImage?

Это было полезно?

Решение

Ладно, это было гораздо более болезненно выяснять, чем я ожидал.Кроме того, хвала NVidia за публикацию этого PDF что является лучшим объяснением записи фильтра Photoshop SDK, чем фактические документы SDK.

Этот код фактически считывает InData и создает пригодный для использования NSImage (много протоколирования, просто чтобы выяснить, что он делает, не стесняйтесь удалять) в дополнение к образцу файла tif для целей отладки.

NSLog(@"Entering LoadImageFromSDK");

unsigned char *bitmapPlanes[4];    
bitmapPlanes[0] = (unsigned char *) (gFilterRecord->inData);

NSLog(@"Params to create bitmap");
NSLog(@"pixelsWide = %d", gFilterRecord->bigDocumentData->imageSize32.h );
NSLog(@"pixelsHigh = %d", gFilterRecord->bigDocumentData->imageSize32.v );
NSLog(@"bitsPerSample = %d", gFilterRecord->depth );
NSLog(@"samplesPerPixel = %d", gFilterRecord->planes );
NSLog(@"hasAlpha = %d", NO );
NSLog(@"isPlanar = %d", NO );
NSLog(@"colorSpaceName = %@", mapImageModeToColorSpace(gFilterRecord->imageMode) );
NSLog(@"bytesPerRow = %d", gFilterRecord->inRowBytes );
NSLog(@"bitsPerPixel = %d", gFilterRecord->depth*gFilterRecord->planes );    

NSBitmapImageRep *bitmapTmp = [[NSBitmapImageRep alloc] initWithBitmapDataPlanes:bitmapPlanes
                                                                      pixelsWide:gFilterRecord->bigDocumentData->imageSize32.h
                                                                      pixelsHigh:gFilterRecord->bigDocumentData->imageSize32.v
                                                                   bitsPerSample:gFilterRecord->depth
                                                                 samplesPerPixel:gFilterRecord->planes
                                                                        hasAlpha:NO 
                                                                        isPlanar:NO 
                                                                  colorSpaceName:mapImageModeToColorSpace(gFilterRecord->imageMode) 
                                                                     bytesPerRow:gFilterRecord->inRowBytes
                                                                    bitsPerPixel:gFilterRecord->depth*gFilterRecord->planes];

NSLog(@"LoadImageFromSDK : Bitmap created = %@", bitmapTmp);

[[bitmapTmp TIFFRepresentation] writeToFile:@"/Users/someuser/temp/sample.tif" atomically:YES];


NSImage *imageTmp = [[NSImage alloc] initWithSize:[bitmapTmp size]];
[imageTmp addRepresentation:bitmapTmp];
NSLog(@"LoadImageFromSDK : Image created = %@", imageTmp);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top