Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > Алгоритмы > Преобразование BMP 24bit->8bit |
Автор: zer 21.05.02, 14:45 |
Нужен быстрый СУБЖ, может кто видел желательно с исходниками на СЯХ, но токо не Дизеринг, народ помогите плз. |
Автор: murph 21.05.02, 16:33 |
Во, вариант - делаешь вектор из 16 млн. байт, каждый элемент которого соответствует цвету, в который надо превратить цвет с номером индекса этого элемента. А потом для каждого байта в потоке делаешь типа a[i] := vect[a[i]]; Гы. Тупо, но зато вычислений мало, но памяти надо 16 мегов выделять. |
Автор: zer 22.05.02, 17:03 |
А попроще нельзя разве ? |
Автор: murph 22.05.02, 17:05 |
Если честно, то я просто не знаю, как там его преобразовавать (соответствие цветов). Но этот способ довольно шустрый зато. А вообще - задай этот вопрос в С++, там есть знающие люди. А эту эху никто не читает. |
Автор: GrAnd 25.05.02, 08:28 |
Формат 24бит BMP есть не что иное как R8G8B8. Другие допустимые форматы это R5G6B5 - 16бит, R3G3B2 - 8бит.(R,G,B - цвета, цифры - количество бит на каждый цвет) Отсюда следует, что достаточно обычными операциями сдига выделить из 8 бит каждого цвета необходимое тебе количество. ;D ;D ;D R G B 10101111 00101110 01101101 24 бита 01111 101110 01101 16 бит 111 110 01 8 бит |
Автор: GrAnd 25.05.02, 08:30 |
P.S. Данную операцию надо проводить для каждой точки. |
Автор: vot 26.05.02, 09:38 |
В приведенном примере, грубо говоря, 4 части красного, 1 зеленого и две - синего. Упростим пример, отбросив младшие разряды: R G B 10100000 00100000 01100000 24 бита 00000 100000 00000 16 бит 000 000 000 8 бит т.о. на выходе получим - _черный_. А надо бы, все-таки, поближе к красному Вывод - решение _не_ верное. |
Автор: GrAnd 26.05.02, 11:35 |
Попробуй данный вариант прогнать через любой графический редактор и ты увидешь то же самое (Но с точным соблюдением цветовой палитры.) Такое преобразование используется всеми графическими редакторами и конверторами. Выходит, что они сами не правы??? А вданном случае ты имеешь цвет, который при переходе к 8 битной палитре превратится строго в черный ;D ;D ;D |
Автор: GrAnd 26.05.02, 11:37 |
Для более подробного ознакомления с цветами и преобразованиями советую почитать доки по Direct и по графическим форматам в MSDN ;D ;D ;D |
Автор: Zloy_Mаx 30.05.02, 12:23 |
На самом деле, оно делается примерно так. 1. Для всех точек уменьшаем глубину цвета тупым делением на 4 (сдвигом, естессно) их R, G и B компонент цвета. 2. производим сортировку полученных цветов и уменьшаем их количество, приравнивая близкие, чтобы общее их число не превысило 256. 3. все цвета взад умножаем на 4. 4. пишем все это в BMP (а все прочие форматы графики - суть есть изврат, ересь и бесовщина )) Причем можно это все сделать (исходя из формата BMP), не загружая картинки. Просто загрузить RGB-компоненты палитры, затем провести преобразование, затем, составив таблицу соответствия "старый номер цвета - новый номер цвета" , записать новый битмап. |
Автор: Demo_S 30.05.02, 13:09 |
усе правильно, ) позволю себе уточнить кое-что после шага 3 надо сформировать палитру из полученных 256 (или меньше) цветов и записывать в бмп уже ее. а вместо каждого цвета каждого пикселя писать его номер в палитре. |
Автор: GrAnd 03.06.02, 07:33 |
Цитата GrAnd, 25.05.02, 12:28:36 Формат 24бит BMP есть не что иное как R8G8B8. Другие допустимые форматы это R5G6B5 - 16бит, R3G3B2 - 8бит.(R,G,B - цвета, цифры - количество бит на каждый цвет) Отсюда следует, что достаточно обычными операциями сдига выделить из 8 бит каждого цвета необходимое тебе количество. ;D ;D ;D R G B 10101111 00101110 01101101 24 бита 01111 101110 01101 16 бит 111 110 01 8 бит Нашел маленький баг. Биты надо брать не младшие, а старшие. R G B 10101111 00101110 01101101 24 бита 10101 001011 01101 16 бит 101 001 01 8 бит ;D ;D ;D |
Автор: vot 03.06.02, 08:29 |
К чему я тебя и подводил в сообщении #6 |
Автор: GrAnd 04.06.02, 09:19 |
Ну бывает Хотя сам вроде бы недавно тоько такой бодягой занимался ;D ;D ;D |
Автор: Jin X 12.06.02, 18:31 |
Я не вчитывался, но кажется, это то, что нужно: http://soft.ivanovo.ru/Linux/Gimp/Grokking-the-GIMP-v1.0/node84.html |
Автор: sourcer 17.06.02, 12:57 |
http://www.codenet.ru/progr/video/pallete.php |
Автор: CoderSerg 26.06.02, 09:44 |
Привет!!! Деление и сдвиг не совсем то чем стоет пользоваться Есть более оригинальный способ: Суть его описана на: http://www.codenet.ru/progr/video/pallete.php Но помоему у тебя эта ссылочка уже есть Сразу замечу, метод просто о ;D ;Dй, работает как зверь - быстро и сердито. Но есть одно но. Если не оптимезировать то на его работу as is надо памяти ~1.5-2.0Mb. Пока |
Автор: andyag 26.06.02, 12:47 |
Если кому интересно, я сегодня написал конвертилку 16 bit WAVE -> 8 bit WAVE. Очень просто делим на 256 и все... Работает. :-) |
Автор: asmer 07.07.02, 16:44 |
для самого корректного преобразования к палитре (без использования шаблонных заливок, шума и других подобных методов) нужно создать табличку со всеми цветами, встретившимся в картинке, отобрать из них 256 самых встречаемых, а потом уже записывать изображение, записывая в результат номер цвета в полученной палитре (или номер цвета, максимально близкому к цвету из палитры)... способ провереный, кто-то даж енто в какую-то прогу затолкал... AdobePhotoshop, что ли, называется... |
Автор: Oxa 10.07.02, 05:14 |
Цитата asmer, 07.07.02, 20:44:47 для самого корректного преобразования к палитре (без использования шаблонных заливок, шума и других подобных методов) нужно создать табличку со всеми цветами, встретившимся в картинке, отобрать из них 256 самых встречаемых, а потом уже записывать изображение, записывая в результат номер цвета в полученной палитре (или номер цвета, максимально близкому к цвету из палитры)... способ провереный, кто-то даж енто в какую-то прогу затолкал... AdobePhotoshop, что ли, называется... Ну а если у тебя на картинке есть что-то маленькое и цветом, который больше не встречается, тогда ты просто его потеряешь. Пример: 256 БОЛЬШИХ полос с уменьшением скажем зеленой составляющей и МАЛЕНЬКИЙ квадрат красного цвета. |
Автор: Oxa 10.07.02, 05:17 |
Пардон, по сылке которую дал Sourcer об этом как раз и сказано. Просто я ее только посмотрел. |
Автор: GrAnd 10.07.02, 05:20 |
Цитата asmer, 07.07.02, 20:44:47 для самого корректного преобразования к палитре (без использования шаблонных заливок, шума и других подобных методов) нужно создать табличку со всеми цветами, встретившимся в картинке, отобрать из них 256 самых встречаемых, а потом уже записывать изображение, записывая в результат номер цвета в полученной палитре (или номер цвета, максимально близкому к цвету из палитры)... способ провереный, кто-то даж енто в какую-то прогу затолкал... AdobePhotoshop, что ли, называется... В PhotoShop'е используется алгоритм простого сглаживания цветов, посредством обычного статистического анализа "встречаемости" цвета. И берутся там все существующие цвета и оттенки. Тем более, то что я описал как раз и используется в Adobe |
Автор: Rechkin 28.07.02, 05:24 |
Вообщем я делал все по следующему алгоритму, довольно просто и дает приличный результат L=sqrt((R^2+G^2+B^2)/3) таким вот образом вычисляем среднегеометрическое |
Автор: oldm 06.12.04, 12:55 |
Цитата http://www.codenet.ru/progr/video/pallete.php Хотелось бы уточнить пару моментов оттуда. Цитата Метод квантования цветов медианным сечением Первый шаг состоит в отсечении "краёв" куба, которые не содержат пикселов. К примеру, если у всех пикселов значения красной компоненты не меньше, чем 8 и не больше, чем 250, то отбрасываются части куба от К="0" до К="7" и от К="251" до К="255." Получается надо пробежатся по всему массиву пикселей битмапа, просмотреть каждую составляющую RGB и только если все пиксели попали под условия(R>=0 || R<=7 || R>=251 || R<=256), отрубить края кубика, а затем тоже самое и для G, и для B - что то не совсем быстрая операция. Поправте, если ерунду несу. Цитата Метод квантования цветов медианным сечением Второй шаг заключается в разрезании полученного параллелепипеда на два в срединной точке (медиане) самой длинной стороны. Если самая длинная сторона параллельна оси B, то компьютер выбирает срединное синее значение из всех синих значений представленных в параллелепипеде (к примеру, 50.000-ое вхождение в отсортированном списке из 100.000 синих значений) и разрезает в этой точке. Теперь параллелепипед разделен на два параллелепипеда меньшего размера, содержащих одинаковое количество пикселов. Самая длинная сторона чего? Цитата Метод квантования цветов медианным сечением Весь предыдущий процесс отсечение пустых "краев" и разрезание самой длинной стороны в срединной точке повторяется для двух меньших параллелепипедов. Теперь исходный куб разделен на четыре параллелепипеда, содержащих приблизительно одинаковое количество пикселов. А разве все такие пустые "края" не были отсечены на первом шаге. Да и совсем не понятно вот это. В 8битный бмп файл после палитры надо писать таблицу соответствия индексов пикселя - его цвету в палитре. Как эту таблицу формировать? |
Автор: Уда 19.01.07, 13:14 |
а кто-нибудь знает, как подобное применить для ARGB? |
Автор: TheBug 24.01.07, 10:21 |
Вообще, по-хорошему, надо палитру делать кластеризацией. Например, методом K-средних. |
Автор: amk 24.01.07, 18:24 |
Median Cut - это тоже что-то вроде кластеризации. Для уменьшения работы можно при генерации цветового куба уменьшить глубину цвета. До 5 бит практически не заметно. У всех этих методов обычно наблюдается один недостаток - выпуклая оболочка выбранных цветов не охватывает все имеющиеся цвета, в результате в некоторых областях не удается смешать цвета. |