首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Cocoa的Photoshop插件-如何获得预览

使用Cocoa的Photoshop插件-如何获得预览
EN

Stack Overflow用户
提问于 2009-07-22 16:40:53
回答 1查看 892关注 0票数 1

我在Mac上实现了一个Photoshop插件,而且我使用的是Cocoa。到目前为止一切正常,但下一步是提供一个“预览”图像,作为我插件窗口的一部分,我被卡住了。我是一个n00b Obj-C程序员,这对我没有什么帮助:-)

到目前为止,我已经得到了类似这样的东西:

代码语言:javascript
复制
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");

此时此刻,它可怕地崩溃了:

代码语言:javascript
复制
 09/07/22 10:23:32 AM Adobe Photoshop Elements[46628] \*\*\* NSCopyMemoryPages(0x0, 0x245f4000, 2265088) failed 

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-07-23 14:35:50

好吧,这比我预期的要痛苦得多。另外,感谢NVidia发布了这个PDF,它比实际的SDK文档更好地解释了Photoshop SDK的过滤记录。

这段代码实际读取inData并生成一个可用的NSImage (大量日志记录只是为了弄清楚它在做什么,可以随意删除),以及用于调试目的的示例tif文件。

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1166580

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档