将指向unsigned char的指针转换为NSImage

时间:2011-03-17 15:50:04

标签: char nsdata unsigned 16-bit

我有一个包含指向数据集的指针的结构,在这种情况下是一个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->图像传输一个字节到数据对象,但我不明白如何将数组结构传递给数据对象。有任何想法吗? 感谢

更多尝试使用您的建议 我可以通过以下方式将此数据转换为.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 :(得分:0)

要创建包含指针块的NSData对象,您应该使用以initWithBytes:开头的三种方法之一,或创建自动释放的NSData对象,使用以dataWithBytes:

开头的类方法之一

更新:我认为如果您想直接从NSImage创建NSData,数据需要包含相应的标头/幻数,以便NSImage可以找出什么代表是。您应该查看原始图像数据的NSBitmapImageRep和Cocoa绘图指南的Images chapter