Pregunta

Tengo una estructura que incluye un puntero a un conjunto de datos, que en este caso es una imagen en escala de grises de 16 bits. Quiero convertir estos datos en una NSIMAGE para poder mostrarlos y luego guardarlos como un archivo .tif. La ruta de los manuales parece ser algo así como:

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

Estoy perdido sobre cómo crear el objeto NSData y asegurar que contiene la matriz de datos de 16 bits. Los intentos de refundir el puntero dan advertencias y no hay datos. Simplemente podría incrementar los punteros, transfiriendo un byte a la vez de la imagen de cuadro al objeto de datos, pero no entiendo cómo comunicar la estructura de la matriz al objeto de datos. ¿Algunas ideas? Gracias

Más intentos con su sugerencia, puedo convertir estos datos en un archivo .tif de la siguiente manera:

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 el archivo .tif así generado, puedo crear una NSIMAGE y mostrarlo:

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

Mi pregunta ahora es: ¿puedo crear un objeto NSData que pueda mostrar de la misma manera? He probado lo siguiente (el producto es la altura*de ancho de la imagen):

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

Cuando intento esto, no muestra nada. También he intentado crear una variedad de uint16_t que tiene los datos y servir el puntero a eso, nuevamente, no se muestra nada. ¿Algunas ideas? Por ejemplo, ¿tengo que decirle a los nsdata que estoy usando 2 bytes por píxel, o algo así? Gracias Monty Wood

¿Fue útil?

Solución

Para crear un NSData objeto que contiene un bloque al que tiene un puntero, debe usar uno de los tres métodos que comienzan con initWithBytes:, o, para crear un autorelado NSData Objeto, use uno de los métodos de clase que comienzan con dataWithBytes:

Actualización: creo que si quieres crear un NSImage directamente de un NSData, los datos deben incluir los encabezados apropiados/números mágicos para que NSImage puede averiguar cuál es la representación. Deberías mirar NSBitmapImageRep y el Capítulo de imágenes de la guía de dibujo de cacao para datos de imágenes sin procesar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top