我对BitmapSource.Create有疑问。我有以下代码,它的行为不符合预期:
reader.BaseStream.Position += BytesInMetadata;
var rawData = new UInt16[NumberOfPixels];
// Read in the raw image data in 16 bit format.
NumberOfPixels.Times((Action<int>)(i => rawData[i] = reader.ReadUInt16()));
var stats = new MsiStats()
{
Mean = rawData.Average(v => (Double)v),
StdDev = rawData.StandardDeviation(v => (Double)v),
Min = rawData.Min(),
Max = rawData.Max()
};
// Convert the 16-bit image to an 8-bit image that can actually be displayed.
var scaledData = ScaleData(rawData, 4.0f, CType);
GCHandle handle = GCHandle.Alloc(scaledData, GCHandleType.Pinned);
using (var bmp = new Bitmap(2048, 2048, 2048, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, handle.AddrOfPinnedObject()))
{
bmp.Save(@"C:\Users\icyr\Work Folders\COBRA_I-3\CAST Data\myOGBitmap.bmp");
}
handle.Free();
var src = BitmapSource.Create(NumberOfColumns, NumberOfRows,
96, 96,
PixelFormats.Gray8, null,
scaledData,
NumberOfRows);
using (var fileStream = new FileStream(@"C:\<somefolder>\myBitmap.bmp", FileMode.OpenOrCreate))
{
BitmapEncoder enc = new BmpBitmapEncoder();
enc.Frames.Add(BitmapFrame.Create(src));
enc.Save(fileStream);
}
我从专有图像文件读取12位值,将其转换为8位,然后将其保存为位图源对象。但是,当我把它读回来(或保存它,就像我在下面所做的那样)它会保存它......错了。我甚至不确定如何描述它。当我在Matlab中读取保存的图像时,从Bitmapsource对象保存的文件只有像素值为17的倍数.scaledData对象中保存的文件具有完整的值范围。
这里发生了什么?不幸的是,我在代码框架内工作,我没有写,除非我想彻底检修整个项目(我不会,也没有时间),我需要继续能够将BitmapSource对象用于我的数据存储目的。
我不知道该怎么做,所以我希望你们可以更好地理解为什么会这样,以及如何防止它以最小的变化这样做。
答案 0 :(得分:1)
显然问题是使用了PixelFormat.Gray8。我将它更改为PixelFormat.Indexed8,使用BitmapPallettes.Gray256作为我的调色板,这似乎解决了我的问题。
var src = BitmapSource.Create(NumberOfColumns, NumberOfRows,
96, 96,
PixelFormats.Indexed8, BitmapPalettes.Gray256,
scaledData,
NumberOfRows);
仍然不明白发生了什么。