Страницы

Поиск по вопросам

понедельник, 3 февраля 2020 г.

Как в C# конвертировать изображение произвольного формата в матрицу?

#c_sharp #изображения


Можно ли создать Int24 (24-битовый тип) в C#?

Основная задача:


Залить каждую отдельную белую область на бинарном изображении уникальным цветом color
формата Format24bppRgb    (color++ для каждой очередной области).
Получить полный список таких объектов, состоящих из конечного набора пикселей.

    


Ответы

Ответ 1



Вы подошли к задаче не с той стороны. Вы, видимо, пытаетесь сделать 24х-битный тип данных чтобы расположить его в массиве, который повторит по структуре картинку. Но в C# так сделать затруднительно. Вместо этого, можно сделать отдельный класс с индексатором, который будет выглядеть снаружи как массив - а внутри будет сам правильно раскладывать цвета пикселей по байтам: public class BitmapAccessor { private byte[] scan0; // Или любое другое хранилище private int stride; // (3 * width + 3) / 4 * 4. Ну или можно взять это число из BitmapData.Stride // ... public Color this[int x, int y] { get { var index = 3 * x + stride * y; return Color.FromArgb(scan0[index], scan0[index+1], scan0[index+2]); // точный формат не помню, возможно аргументы надо поменять местами } set { var index = 3 * x + stride * y; scan0[index] = value.R; scan0[index+1] = value.G; scan0[index+2] = value.B; } } }

Ответ 2



Не обязательно строить велосипед. Возьмите готовый класс System.Drawing.Bitmap, он позволяет работать с пикселями как вам нравится, включая выбор глубины от 4 до 48 бит, указанный вами формат, и еще несколько специфических форматов. Больше подробностей в документации. Заливку, правда, придется реализовывать самостоятельно, готовой нет. Но можно воспользоваться векторными возможностями, если скормить Bitmap в конструктор Graphics. С цветом, можно работать с помощью класса System.Drawing.Color и методов FromArgb() и ToArgb, которые дают возможность получить и задать цвет обычным int. Подробности в документации тут, тут и тут.

Ответ 3



Использовать только 24 бита из 32-х битного числа. Создать отдельную структуру с тремя байтами или отдельный класс с массивом из 3 байт.

Комментариев нет:

Отправить комментарий