Преобразование указателя в безписанном char в NSImage

StackOverflow https://stackoverflow.com/questions/5341543

  •  27-10-2019
  •  | 
  •  

Вопрос

У меня есть структура, которая включает указатель на набор данных, который в этом случае представляет собой 16-битное изображение серого. Я хочу преобразовать эти данные в NSImage, чтобы я мог отобразить его, а затем сохранить их в виде файла .tif. Маршрут из руководств, кажется, что -то вроде:

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

Я потерян в отношении того, как создать объект NSDATA и убедиться, что он содержит массив 16-битных данных. Попытки пересмотреть указатель дают предупреждения и нет данных. Я мог бы просто увеличить указатели, перенося один байт за раз из кадров-> изображения в объект данных, но я не понимаю, как передавать структуру массива с объектом данных. Любые идеи? Спасибо

Больше попыток, используя ваше предложение, я могу преобразовать эти данные в файл .tif следующим образом:

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

С помощью сгенерированного файла .tif я могу создать NSImage и отобразить его:

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

Теперь мой вопрос становится - могу ли я создать объект NSDATA, который я могу отображать таким же образом? Я попробовал следующее (продукт - это высота*ширина изображения):

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

Когда я пробую это, ничего не отображается. Я также пытался создать массив UINT16_T, который имеет данные, и обслуживать указатель на это - опять же, ничего не отображается. Любые идеи? Например, я должен сказать NSDATA, что я использую 2 байта на пиксель или что -то в этом роде? Спасибо, Монти Вуд

Это было полезно?

Решение

Чтобы создать NSData объект, содержащий блок, на который у вас есть указатель, вы должны использовать один из трех методов, которые начинаются с initWithBytes:, или, чтобы создать авторелированное NSData объект, используйте один из методов класса, которые начинаются с dataWithBytes:

Обновление: я думаю, что если вы хотите создать NSImage прямо из NSData, данные должны включать соответствующие заголовки/магические числа, чтобы, чтобы NSImage может выяснить, что такое представление. Вы должны смотреть на NSBitmapImageRep и Изображения глава Руководства по рисованию какао для необработанных данных изображения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top