Преобразуйте от 32 бит/пкс до 8 бит/пкс, индексируемых (C#)

У меня также есть эта проблема в Eclipse. Если вам повезло, что вас не волнует, что уже было записано в LogCat, вы можете нажать кнопку «Очистить журнал» в правом верхнем углу рядом с кнопками V, D, I, W, E.

Если вы выберете устройство и очистите журнал, я обнаружил, что вывод стабилен (по крайней мере, пока он снова не заполнится).

6
задан 5 November 2009 в 23:21
поделиться

4 ответа

Мне пришлось сделать это в большом проекте .NET. Для этого нет ничего в структуре, но эта статья быстро привела меня к решению: http://codebetter.com/blogs/brendan.tompkins/archive/2004/01/26/6103.aspx

0
ответ дан 17 December 2019 в 04:48
поделиться

Ничего не поможет с GDI. Похоже, что индексированные изображения - слишком отсталая технология, и Microsoft не обращает на нее внимания. Все, что вы можете сделать, это читать и записывать индексированные файлы изображений.

Обычно квантование цветов в изображении состоит из двух этапов:
1) Найдите лучшую палитру для изображения (квантование цвета)
2) Сопоставьте исходные солоры с найденной палитрой (Color Mapping)

Насколько я понимаю, у вас уже есть палитра в базе данных, это означает, что самая сложная часть была сделана за вас. Все, что вам нужно сделать, это сопоставить 24-битные цвета с предоставленными цветами палитры. Если у вас нет начальной палитры, вам придется вычислить ее самостоятельно, используя алгоритм квантования: наиболее известны Octrees или Median Cut. Median Cut дает лучшие результаты, но он медленнее и сложнее для реализации и точной настройки.

Чтобы сопоставить цвета, самый простой алгоритм в вашем случае - это вычислить расстояние от исходного цвета до всех цветов палитры и выбрать ближайший.

float ColorDistanceSquared(Color c1, Color c2)
{
    float deltaR = c2.R - c1.R;
    float deltaG = c2.G - c1.G;
    float deltaB = c2.B - c1.B;
    return deltaR*deltaR + deltaG*deltaG + deltaB*deltaB;
}

Вы также можете взвесить каналы, чтобы синий имел меньший вес, не переусердствуйте с ним, иначе это даст ужасные результаты, в частности 30/59/11 не будет работать вообще:

float ColorDistanceSquared(Color c1, Color c2)
{
    float deltaR = (c2.R - c1.R) * 3;
    float deltaG = (c2.G - c1.G) * 3;
    float deltaB = (c2.B - c1.B) * 2;
    return deltaR*deltaR + deltaG*deltaG + deltaB*deltaB;
}

Вызовите эту штуку для всех цветов источника и палитры и найдите Мин. Если вы кэшируете свои результаты по мере продвижения по карте, это будет очень быстро.

Кроме того, исходный цвет редко будет соответствовать цвету палитры достаточно, чтобы не создавать полосы и плоские области и потерю деталей на вашем изображении. Чтобы этого избежать, вы можете использовать дизеринг. Самый простой алгоритм, который дает наилучшие результаты, - это дизеринг диффузии ошибок.

После сопоставления цветов вам нужно будет вручную заблокировать Bitmap и записать туда индексы, поскольку .Net не позволит вам писать в индексированное изображение.

Чтобы этого избежать, вы можете использовать дизеринг. Самый простой алгоритм, который дает лучшие результаты, - это дизеринг диффузии ошибок.

После сопоставления цветов вам придется вручную заблокировать растровое изображение и записать туда индексы, поскольку .Net не позволит вам писать в индексированное изображение.

Чтобы этого избежать, вы можете использовать дизеринг. Самый простой алгоритм, который дает наилучшие результаты, - это дизеринг диффузии ошибок.

После сопоставления цветов вам нужно будет вручную заблокировать Bitmap и записать туда индексы, поскольку .Net не позволит вам писать в индексированное изображение.

3
ответ дан 17 December 2019 в 04:48
поделиться

Этот процесс называется Квантованием . Поскольку каждый цвет представляет 3 упакованных значения, вам необходимо использовать Octrees для решения этой проблемы.

Ознакомьтесь с этой статьей с примером кода.

Статья посвящена получению окончательной палитры для изображение, но ваш процесс будет обратным для второй части, только уменьшите наиболее часто используемые цвета, которые близки к данной палитре.

2
ответ дан 17 December 2019 в 04:48
поделиться

Слово JPEG должно вызывать тревогу. Скорее всего, изображения уже находятся в сильно квантованном цветовом пространстве, и дальнейшая передискретизация потенциально приведет к появлению наложений. Если можете, работайте с несжатыми изображениями, чтобы уменьшить этот эффект.

Ответ на ваш вопрос - да - вы можете сохранить изображения в альтернативном формате, но я не уверен, подходит ли встроенная функциональность для того, что звучит как довольно сложное требование. Если вы можете определить цветовую палитру из коллекции изображений, вы, вероятно, улучшите качество вывода.

Уже упоминавшаяся запись в блоге под названием «Использование GDI + для сохранения кристально-чистых изображений GIF с .NET» содержит полезные ссылки на код.

0
ответ дан 17 December 2019 в 04:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: