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

Другие вопросы по тегам