Значение пикселя для 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);
Другие вопросы по тегам