16位灰度图像的像素值

时间:2020-01-29 13:51:08

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

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

所以首先我有一个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);

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

1 个答案:

答案 0 :(得分: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位图源

var bitmap8bpp = BitmapSource.Create(
    width, height, 96, 96, PixelFormats.Gray8, null, pixels8bpp, width);