Групиране на палитри от изображения и PNG компресия

компресия
Фигура 1 - PNG тестово изображение за изследване, разделителна способност - 800x600

компресия
Фигура 2 - Изображение, компресирано до 256 цвята с помощта на Color Quantizer

изображения
Фигура 3 - Изображение, компресирано до 256 цвята с помощта на разработения алгоритъм

Алгоритъм за групиране на палитри с изображения

Пример за извикване на функция за намаляване на броя на цветовете

  1. String imageFileName = "D:/Projects/PNG/big.png" ;
  2. String outImageFileName = "D:/Projects/PNG/bigout" ;
  3. int ColorCounts = 255;
  4. // Четене на PNG изображения
  5. PngImage изображение = ново PngImage();
  6. BufferedImage bufImage = изображение. read( нов файл (imageFileName));
  7. // Компресия на изображението
  8. CPNGCompression.Compression(bufImage, true, ColorCounts);
  9. // Съхраняване
  10. encoder.setColorType(encoder.COLOR_INDEXED_ALPHA); // Поддръжка на алфа канал
  11. encoder.setCompression(encoder.BEST_COMPRESSION); // PNG ниво на компресия
  12. // Индексирана палитра (PLTE блок) - поддържа се, ако броят на цветовете не надвишава 255
  13. encoder.setIndexedColorMode(encoder.INDEXED_COLORS_AUTO);
  14. // Писане в потока
  15. FileOutputStream outfile = нов FileOutputStream(outImageFileName + ".png");
  16. encoder.encode(bufImage, outfile);
  17. outfile.flush();
  18. outfile.close();
* Този изходен код беше подчертан с инструмента за открояване на изходния код.

  1. публична статична празна компресия
  2. (
  3. BufferedImage aImage, // Изображение за компресиране
  4. boolean aUseFixedColorList, // Цветовете са зададени да не се променят
  5. int aColorCount // Броят необходими изходни цветове
  6. )
* Този изходен код беше маркиран с Изходен кодмаркер.

Заключение

Статията разглежда един от най-простите алгоритми за групиране, използвани при проблема с намаляването на броя на цветовете в изображението. Алгоритъмът се сравнява с добре познато решение - програмата CQ. Допълнителни подобрения на алгоритъма може да са свързани с

  • промяна на критерия за прекратяване на итерацията,
  • промяна на функцията за разстояние между цветовете,
  • преход към друго цветово пространство по време на групиране.

  1. // Настройване на недосегаеми цветове
  2. CPNGCompression.m_fixedColors = нов int[2];
  3. CPNGCompression.m_fixedColors[0] = 0xFF969696;
  4. CPNGCompression.m_fixedColors[1] = 0xFFFFFFFF;
  5. // Компресиране
  6. CPNGCompression.Compression(bufImage, true, 256);
* Този изходен код беше подчертан с инструмента за открояване на изходния код.

Тогава резултатът от компресирането чрез разглеждания тук алгоритъм ще бъде изображение:

CPNGCompression
Фигура 4 - Компресирано изображение, използващодва недосегаемицвята

Размерът на тази картина също е 53 243 байта на диска.

Не знам как да сравня времето на работа на CQ програмата с необходимата точност. Използвайки системния часовник, с точност от +-2 секунди, програмата CQ може да компресира до 256 цвята за34 секунди, което е с порядък по-лошо от резултата на предложения алгоритъм.

Използвани източници

И тук можете да получите грант за тестов период на Yandex.Cloud. Необходимо е само да въведете "Habr" в полето "секретна парола".