2009-07-22 34 views
1

我在Mac上实现一个Photoshop插件,并且我正在使用Cocoa。目前做得不错,但下一步是提供一个“预览”图像,作为我的插件窗口的一部分,并且我被卡住了。我是一个的n00b的OBJ-C程序员,这是不是真的帮助:-)使用Cocoa的Photoshop插件 - 如何获得预览

到目前为止,我有这样的事情:

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上午Adobe Photoshop Elements [46628] *** NSCopyMemoryPages(0x0,0x245f4000,2265088)失败

我可能计算错误的inData大小。帮帮我?

此外,NSImage是否能够正确解释该图像数据blob?或者我应该放弃它,只是做一个逐像素映射到NSImage?

回答

0

好吧,这比我预料的要痛苦得多。此外,感谢NVidia发布此PDF这是比实际的SDK文档更好地解释Photoshop 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); 
相关问题