Значение пикселя для 16-битных изображений в оттенках серого
Я знаю, что это в основном вопрос изображения, а не код, но здесь я попробую.
Итак, сначала у меня есть изображение в оттенках серого 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);
Вот как я создаю массив пикселей.
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();
и создайте BitmapSource 8bpp с помощью
var bitmap8bpp = BitmapSource.Create(
width, height, 96, 96, PixelFormats.Gray8, null, pixels8bpp, width);