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);
我知道这主要是图像问题而不是代码问题,但我会在这里尝试一下。
所以首先我有一个 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 BitmapSourcevar bitmap8bpp = BitmapSource.Create(
width, height, 96, 96, PixelFormats.Gray8, null, pixels8bpp, width);