Question

Je suis un plug-in Photoshop mettre en œuvre sur le Mac, et je le fais en utilisant Cocoa. Ok fait jusqu'à présent, mais l'étape suivante consiste à fournir une image « preview », comme une partie de ma fenêtre de plug-in, et je suis coincé. Je suis un n00b programmeur Obj-C, ce qui est pas vraiment aider :-)

Jusqu'à présent, j'ai quelque chose comme ceci:

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

À l'heure actuelle, il se plante horriblement sur:
    07/09/22 10:23:32 Adobe Photoshop Elements [46628] *** NSCopyMemoryPages (0x0, 0x245f4000, 2265088) a échoué

Je calcul sans doute la taille de InData de manière incorrecte. Aidez-moi?

En outre, est NSImage va être en mesure d'interpréter cette blob de données d'image correctement? Ou devrais-je donner et il suffit de faire une cartographie pixel par pixel dans le NSImage?

Était-ce utile?

La solution

Ok, qui était beaucoup plus pénible à comprendre que je ne l'avais prévu. En outre, bravo à NVidia pour l'affichage de cette PDF qui est meilleure explication de l'enregistrement du filtre SDK Photoshop que les SDK réels docs.

Ce code se lit en fait le InData et produit un utilisable NSImage (beaucoup de l'exploitation forestière juste pour comprendre ce qu'il fait, ne hésitez pas à supprimer), en plus de l'échantillon TIF à des fins de débogage.

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);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top