我试图在我的WPF应用程序中显示16位RAW图像的预览,但它不工作,因为我希望它会。我已经看了无数的例子,在这里关于SA甚至是CodeProject的问题/答案,但是这并没有让我感到很头疼。嗯,实际上它可以完全加载8bit灰度RAW图像并将其显示在应用程序中,而不会有任何奇怪的人为因素,但是当涉及到16位图像时,它会变得混乱起来。WPF C# - 将16位(8位多通道)RAW高度图加载到BitmapSource中
下面是它应该如何看一个例子: https://i.stack.imgur.com/kSCX5.jpg
这是我在尝试加载相同的原始图像(直接导出为从第三方程序16位)的16位版本时: https://i.stack.imgur.com/Melmk.jpg
将8bit图像加载为8bit会给我一半的正确图像。
这是我的导入功能:
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类的参数,我只经历过了,现在,直到我能得到这个工作正常)
我错过了一个步骤?有谁知道如何让这个工作?我试图做出同样的8位输入功能与USHORT阵列,而不是一个字节数组:
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);
}
这样的,但这样做给了我一半的图像,它的很多黑暗比它应该是因为数组中的每个第二个字节有1个字节,其值为0.像素[i/2]再次提供了与前面所述相同的图像(16位加载样本)。
将16bit原始图像加载到Photoshop中,显示导入对话框,其中显示2为8位的通道数(使用2个通道将其设置为16位不会让我导入,但1通道可使用16位)。
这可以解释为什么将16位图像加载到我的WPF应用程序中只能输入其中的一半..但是这留下了一个很大的问号,为什么它不加载第二个通道。
此主题记录不完整,几乎没有讨论任何地方。在这个问题上找不到任何东西..希望找到能够帮助我的人。
谢谢新年快乐!