Frage

Ich habe eine Struktur, die einen Zeiger auf einen Datensatz enthält, der in diesem Fall ein 16-Bit-Graustufenbild ist. Ich möchte diese Daten in ein NSIMage konvertieren, damit ich sie anzeigen und dann als .tif -Datei speichern kann. Die Route aus den Handbüchern scheint so etwas wie zu sein:

(Create *myNSImData from frame->image, which is a pointer)
NSImage *TestImage = [[NSImage alloc] initWithData : myNSImData];
(display TestImage, save it, whatever else)
[TestImage release];

Ich bin verloren, wie man das NSDATA-Objekt erstellt und versichert, dass es das Array von 16-Bit-Daten enthält. Versuche, den Zeiger neu zu fassen, geben Warnungen und keine Daten ab. Ich könnte einfach die Zeiger inkrementieren und jeweils ein Byte vom Frame-> Bild in das Datenobjekt übertragen, aber ich verstehe nicht, wie die Array-Struktur mit dem Datenobjekt kommuniziert. Irgendwelche Ideen? Vielen Dank

Weitere Versuche, Ihren Vorschlag zu verwenden. Ich kann diese Daten auf folgende Weise in eine .tif -Datei konvertieren:

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

Mit der so generierten .tif -Datei kann ich ein NSIMAGE erstellen und anzeigen:

NSImage *TestImage = [[[NSImage alloc] initWithContentsOfFile:inFilePath] autorelease];
[viewWindow setImage: TestImage];

Meine Frage wird jetzt: Kann ich ein NSDATA -Objekt erstellen, das ich auf die gleiche Weise anzeigen kann? Ich habe Folgendes ausprobiert (Produkt ist die Höhe*Breite des Bildes):

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

Wenn ich das versuche, zeigt nichts an. Ich habe auch versucht, ein Array von uint16_t zu erstellen, das die Daten enthält, und den Zeiger darauf zu dienen - wieder zeigt nichts. Irgendwelche Ideen? ZB muss ich der NSData sagen, dass ich 2 Bytes pro Pixel oder so etwas verwende? Danke Monty Wood

War es hilfreich?

Lösung

Um ein zu erstellen NSData Objekt, das einen Block enthält, auf den Sie einen Zeiger haben, sollten Sie eine der drei Methoden verwenden, die mit beginnen initWithBytes:, oder, um eine autoreleasee Erstellung zu erstellen NSData Objekt verwenden eine der Klassenmethoden, die mit beginnen dataWithBytes:

Update: Ich denke, wenn Sie eine erstellen möchten NSImage direkt von an NSData, Die Daten müssen die entsprechenden Header/Magic -Zahlen so enthalten NSImage kann herausfinden, was die Darstellung ist. Sie sollten sich ansehen NSBitmapImageRep und die Bilder Kapitel des Kakaozeichnungshandbuchs für Rohbilddaten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top