Question

I ont une structure qui comprend un pointeur vers un ensemble de données, qui dans ce cas est une image en niveaux de gris de 16 bits. Je veux convertir ces données à un NSImage afin que je puisse l'afficher, puis l'enregistrer comme un fichier .tif. La route des manuels semble être quelque chose comme:

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

Je suis perdu à la façon de créer l'objet NSData et d'assurer qu'il contient le tableau de données 16 bits. Les tentatives visant à refondre les avertissements give pointeur et aucune donnée. Je ne pouvais tout simplement incrémenter les pointeurs, le transfert d'un octet à la fois de l'image DE CADRE> à l'objet de données, mais je ne comprends pas comment communiquer la structure de tableau à l'objet de données. Des idées? Merci

PLUS TENTATIVES UTILISATION DE VOTRE SUGGESTION Je peux convertir ces données dans un fichier TIF de la manière suivante:

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

Avec le fichier TIF ainsi généré, je peux créer un NSImage et l'afficher:

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

Ma question devient maintenant - puis-je créer un objet NSData que je peux afficher de la même manière? J'ai essayé le suivant (le produit est la hauteur * largeur de l'image):

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

Lorsque je tente cela, rien ne se affiche. J'ai aussi essayé de créer un tableau de uint16_t qui a les données, et de servir le pointeur vers cette - encore une fois, rien ne se affiche. Des idées? Par exemple. dois-je dire au NSData que j'utilise 2 octets par pixel, ou quelque chose comme ça? Merci Monty bois

Était-ce utile?

La solution

Pour créer un objet NSData contenant un bloc auquel vous avez un pointeur, vous devez utiliser l'une des trois méthodes qui commencent par initWithBytes: , ou, pour créer un objet NSData autoreleased, l'utilisation l'une des méthodes de classe qui commencent par dataWithBytes:

Mise à jour: Je pense que si vous voulez créer un NSImage directement à partir d'un NSData, les données doivent inclure les en-têtes appropriés / nombres magiques de sorte que NSImage peut comprendre ce que la représentation est. Vous devriez regarder NSBitmapImageRep et Images chapitre du Guide Cocoa Dessin pour les données d'images brutes.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top