BitmapSource.创建问题

本文关键字:问题 创建 BitmapSource | 更新日期: 2023-09-27 18:21:20

我有一个关于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对象来进行数据存储。

我不知道该怎么办,所以我希望你们能更好地理解为什么会发生这种情况,以及如何通过最小的改变来防止这种情况发生。

BitmapSource.创建问题

显然问题在于PixelFormat.Gray8的使用。我将其更改为PixelFormat.Indexed8,使用BitmapPalletts.Gray256作为我的托盘,这似乎解决了我的问题。

var src = BitmapSource.Create(NumberOfColumns, NumberOfRows,
                                96, 96,
                                PixelFormats.Indexed8, BitmapPalettes.Gray256,
                                scaledData,
                                NumberOfRows);

仍然不明白发生了什么。