编程语言
首页 > 编程语言> > 在C#中保存PNG图像时丢失像素深度

在C#中保存PNG图像时丢失像素深度

作者:互联网

我正在创建一个16位灰度图像,并使用C#将其另存为PNG.当我使用GIMP或OpenCV加载图像时,图像以8位而不是16位的精度显示.您知道我的代码有什么问题吗?

1)这是用于创建PNG的代码

 public static void Create16BitGrayscaleImage(int imageWidthInPixels, int imageHeightInPixels, ushort[,] colours,
        string imageFilePath)
    {
        // Multiplying by 2 because it has two bytes per pixel
        ushort[] pixelData = new ushort[imageWidthInPixels * imageHeightInPixels * 2];

        for (int y = 0; y < imageHeightInPixels; ++y)
        {
            for (int x = 0; x < imageWidthInPixels; ++x)
            {
                int index = y * imageWidthInPixels + x;
                pixelData[index] = colours[x, y];
            }
        }

        BitmapSource bmpSource = BitmapSource.Create(imageWidthInPixels, imageHeightInPixels, 86, 86,
            PixelFormats.Gray16, null, pixelData, imageWidthInPixels * 2);


        using (Stream str = new FileStream(imageFilePath, FileMode.Create))
        {
            PngBitmapEncoder enc = new PngBitmapEncoder();
            enc.Frames.Add(BitmapFrame.Create(bmpSource));
            enc.Save(str);
        }


    }

2)这是读取图像属性的Python代码:

import cv2
img = cv2.imread(image_path)

解决方法:

在cv2.imread(filename,flags)的documentation之后,您可以看到存在IMREAD_ANYDEPTH的可选标志.

标志documentation描述IMREAD_ANYDEPTH如下:

If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.

这表明除非您另外指定,否则imread(..)会将图像转换为8位深度.

我希望以下内容以16位深度加载图像.

img = cv2.imread(image_path, cv2.IMREAD_ANYDEPTH)

标签:grayscale,png,16-bit,bitmap,c
来源: https://codeday.me/bug/20191025/1925944.html