la conversione di un puntatore a unsigned char a un NSImage
Domanda
Ho una struttura che comprende un puntatore a una serie di dati, che in questo caso è un'immagine in scala di grigi a 16 bit. Voglio convertire questi dati in un NSImage modo che io possa visualizzarlo e quindi salvarlo come un file con estensione tif. Il percorso da manuali sembra essere qualcosa di simile:
(Create *myNSImData from frame->image, which is a pointer)
NSImage *TestImage = [[NSImage alloc] initWithData : myNSImData];
(display TestImage, save it, whatever else)
[TestImage release];
Sono perso su come creare l'oggetto NSData e assicuro che contiene la matrice di dati a 16 bit. I tentativi di rifusione gli avvertimenti puntatore dare e non ci sono dati. Potrebbe semplicemente incrementare i puntatori, trasferendo un byte alla volta dalla cornice-> immagine all'oggetto dati, ma non capire come comunicare la struttura a matrice per l'oggetto dati. Qualche idea? Grazie
più tentativi USO tuo suggerimento Posso convertire questi dati in un file .TIF nel seguente modo:
for (uint32 row = 0 ; row < MaxHeight ; row++)
{
for (uint32 column = 0;column< MaxWidth;column++)
{
tempData = (uint8_t)*frame->image; //first byte
*frame->image++;
buf[2 * column + 1] = (unsigned char) tempData;
tempData = (uint8_t)*frame->image; //second byte
*frame->image++;
buf[2 * column] = (unsigned char) tempData;
}
TIFFWriteScanline(tiffile,buf,row,0);
}
Con il file TIF così generata, posso creare un NSImage e visualizzarla:
NSImage *TestImage = [[[NSImage alloc] initWithContentsOfFile:inFilePath] autorelease];
[viewWindow setImage: TestImage];
La mia domanda ora diventa - posso creare un oggetto NSData che posso visualizzare nello stesso modo? Ho provato la seguente (prodotto è l'altezza * larghezza dell'immagine):
NSData *ReadImage = [[[NSData alloc] initWithBytes: frame->image length:2*product] autorelease] ;
NSImage *NewImage = [[[NSImage alloc] initWithData:ReadImage] autorelease];
NSSize newSize;
newSize.height = MaxHeight; //height of the image
newSize.width = MaxWidth; //width of the image
[NewImage setSize:newSize];
[viewWindow setImage: NewImage];
Quando provo questo, viene visualizzato nulla. Ho anche provato a generare una serie di uint16_t che ha i dati, e servendo il puntatore che - ancora, display niente. Qualche idea? Per esempio. devo dire la NSData che sto usando 2 byte per pixel, o qualcosa del genere? Grazie Monty Legno
Soluzione
Per creare un oggetto NSData
contenente un blocco a cui si ha un puntatore, è necessario utilizzare uno dei tre metodi che iniziano con initWithBytes:
, o, per creare un oggetto NSData
autoreleased, l'uso uno dei metodi di classe che iniziano con dataWithBytes:
UPDATE: Penso che se si desidera creare un NSImage
direttamente da un NSData
, i dati devono includere i numeri intestazioni appropriate / magia in modo che NSImage
può capire che cosa è la rappresentazione. Si dovrebbe guardare NSBitmapImageRep
e la Immagini capitolo della Guida cacao Disegno per i dati di immagine grezzi.