【发布时间】:2017-01-01 21:24:02
【问题描述】:
我试图在我的 WPF 应用程序中显示 16 位 RAW 图像的预览,但它没有像我希望的那样工作。我已经在 SA 甚至 CodeProject 上查看了无数示例、问题/答案,但这也没有让我走得太远。好吧,实际上它确实如此,因为我可以完全加载 8 位灰度 RAW 图像并将其显示在应用程序上,而不会出现任何奇怪的伪影,但是当涉及 16 位图像时,它就变得一团糟了。
以下是它的外观示例: https://i.stack.imgur.com/kSCX5.jpg
这是我在尝试加载相同原始图像的 16 位版本时得到的结果(直接从第三方程序导出为 16 位): https://i.stack.imgur.com/Melmk.jpg
将 16 位图像加载为 8 位给我一半的正确图像。
这些是我的导入函数:
BinaryReader br = new BinaryReader(File.Open(filename, FileMode.Open));
private void LoadRAWData8bit()
{
int bits = format.BitsPerPixel;
int stride = ((width * bits + (bits - 1)) & ~(bits - 1)) / 8;
byte[] pixels = new byte[stride * height];
for (int i = 0; i < br.BaseStream.Length; ++i)
pixels[i] = br.ReadByte();
br.Close();
BitmapSource bmp = BitmapSource.Create(width, height, 96, 96, format, null, pixels, stride);
RawFile = new CRAW(new Size(width, height), format, stride, bmp);
}
// 16bit load Test
private void LoadRAWData16bit()
{
WriteableBitmap wBmp = new WriteableBitmap(width, height, 96, 96, format, null);
int bpp = format.BitsPerPixel / 8;
byte[] pixels = new byte[wBmp.PixelWidth * wBmp.PixelHeight];
Int32Rect drawRegionRect = new Int32Rect(0, 0, wBmp.PixelWidth, wBmp.PixelHeight);
for (int i = 0; i < br.BaseStream.Length; ++i)
pixels[i] = br.ReadByte();
br.Close();
int stride = wBmp.PixelWidth * bpp;
wBmp.WritePixels(drawRegionRect, pixels, stride, 0);
RawFile = new CRAW(new Size(width, height), format, stride, wBmp);
}
(请不要介意传递给 CRAW 类的参数,我现在只是在试验,直到我可以让它正常工作。)
我错过了一步吗?有谁知道如何让它工作?我尝试使用 ushort 数组而不是字节数组来制作相同的 8 位导入函数:
private void LoadRAWData16bit()
{
int bits = format.BitsPerPixel;
int stride = ((width * bits + (bits - 1)) & ~(bits - 1)) / 8;
int bpp = format.BitsPerPixel / 8;
ushort[] pixels = new ushort[stride * height * bpp];
for (int i = 0; i < br.BaseStream.Length; i += sizeof(ushort))
pixels[i] = br.ReadUInt16();
br.Close();
BitmapSource bmp = BitmapSource.Create(width, height, 96, 96, format, null, pixels, stride);
RawFile = new CRAW(new Size(width, height), format, stride, bmp);
}
像这样,但是这样做给了我一半的图像,而且它比预期的要暗很多,因为数组中每个第 2 个字节有 1 个字节的值为 0。做像素 [i / 2] 再次给了我与前面提到的相同的图像(16 位加载示例)。
将 16 位原始图像加载到 Photoshop 会显示导入对话框,该对话框建议将通道数 2 作为 8 位(将其设置为 16 位和 2 个通道不会让我导入它,但 16 位和 1 个通道可以工作)。
这可以解释为什么将 16 位图像作为 8 位加载到我的 WPF 应用程序中只导入其中的一半……但这给我留下了一个很大的问号,即为什么它也没有加载第二个通道。
这个主题的文档记录很差,几乎没有在任何地方讨论过。在这件事上找不到任何东西..希望找到能够帮助我的人。
谢谢,新年快乐!
【问题讨论】: