我知道这主要是一个图像问题,而不是代码,但是我在这里试一下。
所以首先我有一个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);
这就是我创建像素数组的方式。
答案 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);