преобразование указателя на неподписанный символ в NSImage - PullRequest
1 голос
/ 17 марта 2011

У меня есть структура, которая включает указатель на набор данных, который в данном случае представляет собой 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-битных данных. Попытки переделать указатель дают предупреждения, а данные отсутствуют. Я мог бы просто увеличить указатели, передавая по одному байту за раз от frame-> image к объекту данных, но я не понимаю, как передать структуру массива объекту данных. Есть идеи? Спасибо

БОЛЬШЕ попыток использовать ваше предложение Я могу преобразовать эти данные в файл .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 байта на пиксель, или что-то подобное? Спасибо Монти Вуд

1 Ответ

0 голосов
/ 27 апреля 2011

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

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

...