【问题标题】:Photoshop Plugin using Cocoa - How to get a preview使用 Cocoa 的 Photoshop 插件 - 如何获得预览
【发布时间】:2009-07-22 16:40:52
【问题描述】:

我正在 Mac 上实现一个 Photoshop 插件,我正在使用 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");

目前,它在以下位置严重崩溃:
22 年 9 月 7 日上午 10:23:32 Adob​​e Photoshop Elements[46628] *** NSCopyMemoryPages(0x0, 0x245f4000, 2265088) 失败

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

另外,NSImage 是否能够正确解释该图像数据块?还是我应该放弃它,只对 NSImage 进行逐像素映射?

【问题讨论】:

    标签: cocoa plugins photoshop preview


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2010-11-09
      • 2019-09-20
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多