1

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

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

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

4

1 回答 1

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);
于 2020-01-29T14:43:25.507 回答