У меня также есть эта проблема в Eclipse. Если вам повезло, что вас не волнует, что уже было записано в LogCat, вы можете нажать кнопку «Очистить журнал» в правом верхнем углу рядом с кнопками V, D, I, W, E.
Если вы выберете устройство и очистите журнал, я обнаружил, что вывод стабилен (по крайней мере, пока он снова не заполнится).
Мне пришлось сделать это в большом проекте .NET. Для этого нет ничего в структуре, но эта статья быстро привела меня к решению: http://codebetter.com/blogs/brendan.tompkins/archive/2004/01/26/6103.aspx
Ничего не поможет с 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 упакованных значения, вам необходимо использовать Octrees для решения этой проблемы.
Ознакомьтесь с этой статьей с примером кода.
Статья посвящена получению окончательной палитры для изображение, но ваш процесс будет обратным для второй части, только уменьшите наиболее часто используемые цвета, которые близки к данной палитре.
Слово JPEG должно вызывать тревогу. Скорее всего, изображения уже находятся в сильно квантованном цветовом пространстве, и дальнейшая передискретизация потенциально приведет к появлению наложений. Если можете, работайте с несжатыми изображениями, чтобы уменьшить этот эффект.
Ответ на ваш вопрос - да - вы можете сохранить изображения в альтернативном формате, но я не уверен, подходит ли встроенная функциональность для того, что звучит как довольно сложное требование. Если вы можете определить цветовую палитру из коллекции изображений, вы, вероятно, улучшите качество вывода.
Уже упоминавшаяся запись в блоге под названием «Использование GDI + для сохранения кристально-чистых изображений GIF с .NET» содержит полезные ссылки на код.