Пиксельное значение для 16-битных изображений в градациях серого - PullRequest
1 голос
/ 29 января 2020

Я знаю, что это в основном вопрос с изображением, а не код, но здесь я сделаю снимок.

Итак, сначала у меня есть изображение в градациях серого 8 бит / пиксель (растровое изображение). Это означает, что каждый пиксель представлен в 1 байте. Это означает, что значение пикселя является байтовым значением. Достаточно ясно.

Но тогда ...

У меня есть изображение в градациях серого 16 бит / пиксель (растровое изображение). Это означает, что каждый пиксель представлен в 2 байта. Это ясно для меня. Теперь я создаю массив byte [], который будет содержать каждое значение байта.

Для изображения 1024x1024 у меня будет 2097152 байта. Это 1024 *1024* 2.

Мой вопрос сейчас, как мне получить значение пикселя для определенного c пикселя.

Скажем, для пикселя в позиции (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 Ответ

1 голос
/ 29 января 2020

Может быть проще использовать 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];

Чтобы преобразуйте массив пикселей 16 бит на пиксель в массив размером 8 бит на пиксель, просто разделите значение каждого пикселя на 256

var pixels8bpp = pixels.Select(p => (byte)(p / 256)).ToArray();

и создайте битовый ресурс 8 бит на пиксель на

var bitmap8bpp = BitmapSource.Create(
    width, height, 96, 96, PixelFormats.Gray8, null, pixels8bpp, width);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...