C# - Как преобразовать изображение в 8-битное цветное изображение?
Мне нужно преобразовать PNG-изображение, загруженное из файла, в 8-битный массив байтов, используемый другим устройством (встроенное программирование).
Я копирую пиксель за пикселем в новое изображение, созданное 16-битным цветом - Format16bppRgb565
, но мне нужно Format8bpp
, которого нет в.NET Framework. (Я не могу использовать Format8bppIndexed
поскольку другое устройство не может обрабатывать индексированные растровые изображения)
Bitmap img = new Bitmap(imgPath);
Bitmap img8 = new Bitmap(imgW, imgH, PixelFormat.Format16bppRgb565);
for (int I = 0; I <= img.Width - 1; I++) {
for (int J = 0; J <= img.Height - 1; J++) {
img8.SetPixel(I, J, img.GetPixel(I, J));
}
}
Итак, как я могу преобразовать изображение в 8-битный массив пикселей?
- Могу ли я использовать 8-битный индексированный формат и извлечь байты? -
Format8bppIndexed
- Можно ли рассчитать цвета пикселей, уменьшив 32-битные значения цветов R,G,B до 8-битных?
- Есть ли библиотека C#, которая уже делает это?
- "Самый простой способ - создать новое 8-битное растровое изображение и нарисовать на нем 24-битное изображение". - как?
2 ответа
Хотя я не уверен, как это сделать с простым ванильным C#, вы можете использовать библиотеки проекта FreeImage для преобразования форматов изображений:
FreeImage - это проект библиотеки с открытым исходным кодом для разработчиков, которые хотели бы поддерживать популярные форматы графических изображений, такие как PNG, BMP, JPEG, TIFF и другие, в соответствии с требованиями современных мультимедийных приложений. FreeImage прост в использовании, быстр, безопасен для многопоточности, совместим со всеми 32-битными версиями Windows и кроссплатформенен (работает как с Linux, так и с Mac OS X).
Он написан на C++, но имеет хорошие.NET-оболочки, которые вы можете использовать.
Я уже сделал это в одном проекте распознавания образов. Поиск некоторых книг обработки изображений и распознавания образов вы можете найти эти решения.
а) Если вы хотите преобразовать в оттенки серого, вы можете найти в общем два решения.
# 1 Усреднение каналов RGB. - Вы можете взять 8-битные значения для каждого отдельного канала и рассчитать пиксель = (R + G + B) / 3
# 2 Возьмите только зеленый компонент. Это лучше всего смотреть.
б) Если вы хотите преобразовать в 8-битное представление цвета, вам нужно использовать таблицу цветов. Вы можете увидеть решение здесь http://www.codeproject.com/KB/graphics/Image_Bitdepth_Conversion.aspx