Photoshop Plugin utilizzando cacao - Come ottenere un'anteprima
Domanda
Sono l'attuazione di un plugin di Photoshop su Mac, e lo sto facendo con cacao. Facendo bene finora, ma il passo successivo è quello di fornire un'immagine "anteprima", come una parte della mia finestra del plugin, e mi sono bloccato. Sono un programmatore n00b Obj-C, che non è davvero aiutando :-)
qualcosa Finora ho avuto in questo modo:
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");
Al momento, si blocca orribilmente on:
09/07/22 10:23:32 Adobe Photoshop Elements [46628] *** NSCopyMemoryPages (0x0, 0x245f4000, 2.265.088) non è riuscito
Sono probabilmente il calcolo delle dimensioni del Indata in modo non corretto. Aiuto?
Inoltre, è NSImage sta per essere in grado di interpretare correttamente che blob dati di immagine? O devo rinunciare e basta fare una mappatura dei pixel-by-pixel nel NSImage?
Soluzione
Ok, questo era il modo più doloroso per capire di quanto mi aspettassi. Inoltre, complimenti a NVIDIA per questo distacco PDF che è un spiegazione migliore del record di filtro Photoshop SDK che la documentazione SDK attuali.
Questo codice legge in realtà l'Indata e produce un utile NSImage (un sacco di registrazione solo per capire che cosa sta facendo, non esitate a rimuovere) in aggiunta al file tif di esempio a scopo di debug.
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);