繁体   English   中英

16 位灰度图像的像素值

[英]Pixel value for 16 bits grayscale images

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

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

但是之后...

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

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

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

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

首先,我需要这个来进行一些需要像素值的计算,然后我想更改位图的调色板,它适用于 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);

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

对像素数组使用 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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM