С# - Как преобразовать изображение в 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-битное изображение». - как?

person Robin Rodricks    schedule 19.11.2009    source источник
comment
Вы говорите, что ваше устройство не может индексироваться. Так как же он использует 8 бит на пиксель? Это оттенки серого?   -  person Chris    schedule 19.11.2009
comment
Или у него есть 2 бита для красного, 3 бита для зеленого и 3 бита для синего или что-то в этом роде?   -  person Chris    schedule 19.11.2009
comment
Самая сложная часть из того, что я вижу, это создание фактической палитры.   -  person Nyerguds    schedule 31.03.2017


Ответы (2)


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

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

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

person Dror Helper    schedule 19.11.2009

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

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

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

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

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

person Patrik    schedule 26.12.2011