C # - Как преобразовать изображение в 8-битное цветное изображение?

StackOverflow https://stackoverflow.com/questions/1761042

  •  21-09-2019
  •  | 
  •  

Вопрос

Мне нужно преобразовать изображение 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-битное изображение". - как?
Это было полезно?

Решение

Хотя я не уверен, как это сделать с помощью простого ванильного C #, вы можете использовать Проект свободного изображения библиотеки для преобразования форматов изображений:

Freeimage в это библиотека с открытым исходным кодом проект для разработчиков, которые хотели бы поддержка популярных графических изображений форматов, таких как PNG, BMP или файлы JPEG, TIFF и другим по мере необходимости с помощью современных мультимедийных приложения.FreeImage прост в использовании, быстр, безопасен для многопоточности, совместим со всеми 32-разрядными версиями Windows и кроссплатформенен (работает как с Linux, так и с Mac OS X).

Он написан на C ++, но имеет хорошие .Вы можете использовать сетевые оболочки.

Другие советы

Я уже делал это в одном проекте по распознаванию образов.Просматривая некоторые книги по обработке изображений и распознаванию образов, вы можете найти эти решения.

а) Если вы хотите преобразовать в оттенки серого, вы можете найти, в общем, два решения.

#1 Усреднение каналов RGB.- Вы можете взять 8-битные значения для каждого отдельного канала и вычислить пиксель = ( R + G + B ) / 3

#2 Берите только Зеленый компонент.Это лучше всего просматривается.

б) Если вы хотите преобразовать в 8-битное цветовое представление, вам необходимо использовать таблицу цветов.Вы можете увидеть решение здесь http://www.codeproject.com/KB/graphics/Image_Bitdepth_Conversion.aspx

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top