Уменьшите количество цветов в палитре PNG-8 с помощью библиотеки FreeImage (C #) - PullRequest
2 голосов
/ 10 февраля 2012

Я использовал библиотеку FreeImageNET для квантования своего растрового изображения как

using (FreeImageAPI.FreeImageBitmap fiBitmap = FreeImageAPI.FreeImageBitmap.FromHbitmap(bmp.GetHbitmap()))
            {
                if (fiBitmap.ColorDepth > 24)
                {
                    fiBitmap.ConvertColorDepth(FreeImageAPI.FREE_IMAGE_COLOR_DEPTH.FICD_08_BPP);
                }

                //quantize using the NeuQuant neural-net quantization algorithm 
                fiBitmap.Quantize(FreeImageAPI.FREE_IMAGE_QUANTIZE.FIQ_NNQUANT, 256);


                fiBitmap.Save("test_z.png", FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_BEST_COMPRESSION);

                //fiBitmap.Save(ms, FreeImageAPI.FREE_IMAGE_FORMAT.FIF_PNG, FreeImageAPI.FREE_IMAGE_SAVE_FLAGS.PNG_Z_DEFAULT_COMPRESSION);
            }

Это дает мне PNG-8 с палитрой из 256 цветов. Используя Photoshop, я обнаружил, что мог бы еще больше уменьшить размер, если бы использовал Adaptive Algorithm с уменьшенной цветовой палитрой, скажем, 128, 64, 16 и т. Д. Повторное его открытие показывает, что Photoshop заполняет уровни серого в этих оставшихся (более высоких) индексах.

Я не могу заставить FreeImageAPI.FreeImageBitmap.Quantize() производить аналогичный PNG с ограниченной палитрой, a la PIL convert(), где вы можете указать как алгоритм, так и размер палитры.

Спасибо.

1 Ответ

1 голос
/ 09 апреля 2012

Закончено повторное внедрение квантования с использованием открытых исходников из Интернета.

...