将ushort数组转换为图像对象

3

我有一个ushort像素数据的数组,需要将其保存为jpeg文件。从我所发现的信息来看,可以通过使用

Image.Save(path, ImageFormat.Jpeg);

但我不知道如何将ushort数据放入Image对象中。我已经找到了使用字节数组的方法,但没有找到使用ushort的方法。 我已经花费了太多时间来解决这个问题,现在我向强大的StackOverflow求助,我该怎么做?

编辑: 抱歉,这些ushorts是16位灰度值。


不清楚为什么您的数据是ushort类型(0-256或16位色深度)。我会指向BitConverter,因为它可能(也可能不)包含您的答案。 - Talljoe
“array of ushort pixel data” 单独来看没有意义。数组的数据格式是什么? - Matthew Flaschen
3个回答

2
我认为你需要实际创建一个Bitmap,将像素绘制到上面,然后保存。

就像这样:

var bitmap = new Bitmap(sizeX, sizeY, Imaging.PixelFormat.Format16bppGrayScale)

for (y = 0; ...)
for (x = 0; ...)
{
  bitmap.SetPixel(x, y, color information from ushort array);
}

bitmap.Save("filename.jpg", ImageFormat.Jpeg);

请注意,我不知道如何将16位灰度色信息传递给Color结构体。

我同意,如果您获得了原始像素数据(以任何格式),最直接的方法是逐像素创建位图。 - TheSean
这很好,但并没有回答如何将_ushort_数据放入位图的问题。 - Dan Vogel
这就是我最终采取的做法,看起来运行良好。但是需要注意的是JPEG不支持16位灰度,因此我使用了PixelFormat.Format24bppRgb,并将r、g和b设置为相同的值。 - Dan Vogel
那么,由于R、G和B每个只有1字节大小,你实际上失去了65536-256个灰度值? - VVS
是的,但我正在创建的JPEG是用于缩略图的,所以损失是可以接受的。我尝试使用PixelFormat.Format48bppRgb,以避免细节损失,但结果有些奇怪。Format24bppRgb可以工作,所以我很满意。 - Dan Vogel

2
这是一个基于被接受的答案的完整工作示例:
 public static void SaveJpg(string fileName,int sizeX,int sizeY,ushort [] imData)
    {
        var bitmap = new Bitmap(sizeX, sizeY, PixelFormat.Format48bppRgb);
        int count = 0;
        for (int y = 0; y < sizeY; y++)
        {
            for (int x = 0; x < sizeX; x++)
            {
                bitmap.SetPixel(x, y, Color.FromArgb(imData[count], imData[count], imData[count]));
                count++;
            }
        }
        bitmap.Save(fileName, ImageFormat.Jpeg);

    }

1

我相信您想要使用 Bitmap 类,它是 Image 的子类。这个 MSDN 参考资料可能会有所帮助。


这并没有告诉我如何将ushort数据放入Bitmap对象中。 - Dan Vogel
我认为Bitmap.SetPixel()是显而易见的。 - Paul Sonier
再次强调,这并没有告诉我如何将ushort数据放入Bitmap对象中。SetPixels需要一个Color对象而不是ushort值。正如我的问题所述,我知道如何构建图像(Bitmap源自Image),但不知道如何使用ushort数据。 - Dan Vogel
1
@DanVogel:确定ushort值映射到哪种颜色取决于您。您想让0是黑色、白色还是红色?由你决定;但是您必须将其放入代码中并使用该转换信息将您的ushorts转换为颜色,然后通过setpixel将其放入位图中。 - Paul Sonier

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接