Групиране на палитри от изображения и PNG компресия
Фигура 1 - PNG тестово изображение за изследване, разделителна способност - 800x600 Фигура 2 - Изображение, компресирано до 256 цвята с помощта на Color Quantizer Фигура 3 - Изображение, компресирано до 256 цвята с помощта на разработения алгоритъмАлгоритъм за групиране на палитри с изображения
Пример за извикване на функция за намаляване на броя на цветовете
- String imageFileName = "D:/Projects/PNG/big.png" ;
- String outImageFileName = "D:/Projects/PNG/bigout" ;
- int ColorCounts = 255;
- // Четене на PNG изображения
- PngImage изображение = ново PngImage();
- BufferedImage bufImage = изображение. read( нов файл (imageFileName));
- // Компресия на изображението
- CPNGCompression.Compression(bufImage, true, ColorCounts);
- // Съхраняване
- encoder.setColorType(encoder.COLOR_INDEXED_ALPHA); // Поддръжка на алфа канал
- encoder.setCompression(encoder.BEST_COMPRESSION); // PNG ниво на компресия
- // Индексирана палитра (PLTE блок) - поддържа се, ако броят на цветовете не надвишава 255
- encoder.setIndexedColorMode(encoder.INDEXED_COLORS_AUTO);
- // Писане в потока
- FileOutputStream outfile = нов FileOutputStream(outImageFileName + ".png");
- encoder.encode(bufImage, outfile);
- outfile.flush();
- outfile.close();
- публична статична празна компресия
- (
- BufferedImage aImage, // Изображение за компресиране
- boolean aUseFixedColorList, // Цветовете са зададени да не се променят
- int aColorCount // Броят необходими изходни цветове
- )
Заключение
Статията разглежда един от най-простите алгоритми за групиране, използвани при проблема с намаляването на броя на цветовете в изображението. Алгоритъмът се сравнява с добре познато решение - програмата CQ. Допълнителни подобрения на алгоритъма може да са свързани с
- промяна на критерия за прекратяване на итерацията,
- промяна на функцията за разстояние между цветовете,
- преход към друго цветово пространство по време на групиране.
- // Настройване на недосегаеми цветове
- CPNGCompression.m_fixedColors = нов int[2];
- CPNGCompression.m_fixedColors[0] = 0xFF969696;
- CPNGCompression.m_fixedColors[1] = 0xFFFFFFFF;
- // Компресиране
- CPNGCompression.Compression(bufImage, true, 256);
Тогава резултатът от компресирането чрез разглеждания тук алгоритъм ще бъде изображение:
Фигура 4 - Компресирано изображение, използващодва недосегаемицвятаРазмерът на тази картина също е 53 243 байта на диска.
Не знам как да сравня времето на работа на CQ програмата с необходимата точност. Използвайки системния часовник, с точност от +-2 секунди, програмата CQ може да компресира до 256 цвята за34 секунди, което е с порядък по-лошо от резултата на предложения алгоритъм.
Използвани източници
И тук можете да получите грант за тестов период на Yandex.Cloud. Необходимо е само да въведете "Habr" в полето "секретна парола".