【问题标题】:converting a pointer to unsigned char to an NSImage将指向 unsigned char 的指针转换为 NSImage
【发布时间】:2011-03-17 15:50:03
【问题描述】:

我有一个结构,其中包含一个指向数据集的指针,在本例中是一个 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 个字节,或者类似的东西?谢谢蒙蒂伍德

【问题讨论】:

    标签: char nsdata unsigned 16-bit


    【解决方案1】:

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

    更新:我认为如果你想直接从NSData 创建一个NSImage,数据需要包含适当的标题/幻数,以便NSImage 可以弄清楚表示是什么。您应该查看 Cocoa 绘图指南的 NSBitmapImageRepImages chapter 以获取原始图像数据。

    【讨论】:

    • 据我所知,如果我使用 NSBitmapImageRep,在某些时候,没有明确处理每个像素的情况下,没有任何实用的方法可以创建 NSData 对象。传递指针的每一种排列似乎都给我带来了铸造问题。当然,仍然存在获取 NSBitmapImageRep 对象并将其转换为 NSImage 的问题。 (据我从文档中得知,这意味着以带有标头信息的已知格式保存到磁盘或缓存中,这是我已经使用 libtiff 成功完成的工作。)感谢您为我指明正确的方向!
    猜你喜欢
    • 2023-03-08
    • 2015-03-31
    • 2018-06-08
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-12
    相关资源
    最近更新 更多