Преобразование указателя в безписанном char в NSImage
Вопрос
У меня есть структура, которая включает указатель на набор данных, который в этом случае представляет собой 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
и Изображения глава Руководства по рисованию какао для необработанных данных изображения.