在 C# 中保存 PNG 图像时丢失像素深度
Losing pixel depth when saving PNG image in C#
我正在创建一个 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)
我正在创建一个 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)