首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BitmapSource.Create问题

BitmapSource.Create问题
EN

Stack Overflow用户
提问于 2015-11-11 04:17:33
回答 1查看 426关注 0票数 0

我有一个关于BitmapSource.Create的问题。我有以下代码,但它的行为与预期不符:

代码语言:javascript
复制
  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位,然后将其保存为一个bitmapsource对象。然而,当我读回它(或保存它,如下所示)时,它会保存它……不对。我甚至不知道该怎么形容它。当我在Matlab中读取保存的图像时,从Bitmapsource对象保存的文件只具有17的倍数的像素值。从scaledData对象保存的文件具有完整的值范围。

这里发生了什么事?不幸的是,我在一个不是我编写的代码框架中工作,除非我想彻底检查整个项目(我没有,也没有时间),否则我需要继续使用BitmapSource对象来存储我的数据。

我不知道在这里做什么,所以我希望你们能更好地理解为什么会发生这种情况,以及如何在最小的改动下防止它发生。

EN

回答 1

Stack Overflow用户

发布于 2015-11-11 07:05:31

显然,问题出在PixelFormat.Gray8的使用上。我将其改为PixelFormat.Indexed8,使用BitmapPallettes.Gray256作为我的调色板,这似乎解决了我的问题。

代码语言:javascript
复制
var src = BitmapSource.Create(NumberOfColumns, NumberOfRows,
                                96, 96,
                                PixelFormats.Indexed8, BitmapPalettes.Gray256,
                                scaledData,
                                NumberOfRows);

我还是不明白到底发生了什么。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33638790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档