2009-07-22 8 views
1

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

До сих пор у меня есть что-то вроде этого:

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"); 

На данный момент он падает ужасно на:
09/07/22 10:23:32 AM Adobe Photoshop Elements [46628] *** NSCopyMemoryPages (0x0, 0x245f4000, 2265088) не удалось

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

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

ответ

0

Хорошо, это было более болезненно, чем я ожидал. Кроме того, наградно для 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);