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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top