【问题标题】:Pixel value for 16 bits grayscale images16 位灰度图像的像素值
【发布时间】:2020-05-15 00:51:30
【问题描述】:

我知道这主要是一个图像问题而不是代码,但我会在这里试一试。

首先我有一个 8 位/像素的灰度图像(位图)。这意味着每个像素都表示为 1 字节。这意味着像素值是字节值。够清楚了。

然后……

我有一个 16 位/像素的灰度图像(位图)。这意味着每个像素都表示为 2 个字节。这对我来说很清楚。现在我创建一个 byte[] 数组来保存每个字节值。

对于 1024x1024 的图像,我将有 2097152 字节。它是 1024*1024*2。

我现在的问题是,如何获取特定像素的像素值。

假设位置(X|Y)处的像素,字节为 84 和 77。如何将这两个值转换为像素值。

首先我需要这个来进行一些需要像素值的计算,然后我想更改位图的调色板,它适用于每像素 8 位的图像,但不适用于每像素 16 位的图像。

任何帮助都会很好。

 var width = bitmap.PixelWidth;
            var height = bitmap.PixelHeight;
            var dpiX = bitmap.DpiX;
            var dpiY = bitmap.DpiY;

            byte[] pixels = new byte[
                     bitmap.PixelHeight * bitmap.PixelWidth *
                         bitmap.Format.BitsPerPixel / 8];

            bitmap.CopyPixels(pixels, bitmap.PixelWidth * bitmap.Format.BitsPerPixel / 8, 0);

这就是我创建像素数组的方式。

【问题讨论】:

  • @Clemens public virtual void CopyPixels(Array pixel, int stride, int offset);第三个参数是偏移量。第二个参数是步幅。
  • 哦,很抱歉造成混乱。如果您“想要更改位图的调色板”,则无论如何都应该使用索引格式,也许是 Indexed8。
  • 对不起,我没有关注。我猜 2 字节的像素值将是 2 字节的乘积(84*77 = 6468)。但是这个值超出了我的 0..255 间隔(8 位)的范围
  • 16 位像素值的范围为 0..65535。该值将计算为 (256 * 84) + 77。
  • 那么这意味着如果我想将 16 位转换为 8 位将是 84/256 + 77?

标签: c# wpf image bitmap bits-per-pixel


【解决方案1】:

对像素数组使用 2 字节类型可能更容易:

var width = bitmap.PixelWidth;
var height = bitmap.PixelHeight;
var pixels = new ushort[width * height];

bitmap.CopyPixels(pixels, 2 * width, 0);

直接从该数组访问单个像素值:

var x = 100;
var y = 200;
var pixel = (int)pixels[width * y + x];

为了将 16bpp 像素数组转换为 8bpp 数组,只需将每个像素值除以 256

var pixels8bpp = pixels.Select(p => (byte)(p / 256)).ToArray();

并通过

创建一个 8bpp BitmapSource
var bitmap8bpp = BitmapSource.Create(
    width, height, 96, 96, PixelFormats.Gray8, null, pixels8bpp, width);

【讨论】:

  • 谢谢,我明天试试这个,但看起来我需要的东西。
  • 谢谢,我设法利用您回复中的信息熟练地编写代码,我想我已经到了我想去的地方。非常感谢!
猜你喜欢
  • 2015-06-29
  • 1970-01-01
  • 2017-07-31
  • 2012-06-13
  • 2012-11-18
  • 1970-01-01
  • 2011-12-25
  • 2021-12-23
  • 2014-11-03
相关资源
最近更新 更多