Есть изображение которое хранится в байтовом массиве. Оно было получено через функцию GetDIBits(); Размер его получился очень большой. Есть ли какието стандартные или не стандартные способы его сжать.
дык от самого изображения зависит - если полноцветное - то пнг можно заюзать, если 256 - палитра, и т.д.
Изображение полноцветное. BITMAP. Сжимать надо его не записуя в файл. Если можно хотелось бы увидеть какойнибудь алгоритм.
во-первых если оно полноцветное, то сильно его не сожмешь (зависит, правда, от самой картинки), а во-вторых я особо смысла не вижу - расходы на сжатие и разжатие будут большие, да и работать не очень удобно, короче, тут куча ньюансов.
Да, эт точно. Полноцветное изображение RGB сначала переводится в другую цветовую схему, где потеря при сжатии информации о цвете (цветовом слое) не исказит сильно саму картинку после разжатия. Ведь можно RGB разложить по R, G, B и сжимать по-отдельности, но результат совмещения потом после разжатия и совмещения каналов будет насколько мне известно неестественный. Потому сложное это дело, тем более какой алгоритм. Можно диссертацию защитить после написания такого кодека. Если нужно пожать в памяти, то видимо следует искать стандартные функции из каких библиотек сторонних или тех, что входят в ОС. Таких API не знаю. В принципе преобразовать в другую цветовую модель не сложно, но вот алгоритм сжатия каналов реализовывать - это да-а. Зависит от изображения, если "гладкое" в смысле низкочастотности спектра по Фурье (или вейвлетам), то тут jpeg можно применять - он пожмёт. Если изображение большое и имеет в себе лишь несколько цветов в палитре и огромные "пустоты" типа когда на белой кавне нарисовали пару кружочков, то тут можно обойтись какой модификацией RLE алгоритма - пожмёт и ещё как и без потерь. Трудный енто вопрос.