На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Преобразование BMP 24bit->8bit
    Нужен быстрый СУБЖ, может кто видел желательно с исходниками на СЯХ, но токо не Дизеринг, народ помогите плз.
      Во, вариант - делаешь вектор из 16 млн. байт, каждый элемент которого соответствует цвету, в который надо превратить цвет с номером индекса этого элемента. А потом для каждого байта в потоке делаешь типа

      a[i] := vect[a[i]];
      Гы. Тупо, но зато вычислений мало, но памяти надо 16 мегов выделять.
        А попроще нельзя разве ?
          Если честно, то я просто не знаю, как там его преобразовавать (соответствие цветов). Но этот способ довольно шустрый зато.
          А вообще - задай этот вопрос в  С++, там есть знающие люди. А эту эху никто не читает.
            Формат 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 бит
              P.S.
              Данную операцию надо проводить для каждой точки. ;)
                В приведенном примере, грубо говоря, 4 части красного, 1 зеленого и две - синего.
                Упростим пример, отбросив младшие разряды:
                     R            G             B
                10100000 00100000 01100000 24 бита
                    00000    100000      00000 16 бит
                       000         000         000  8 бит

                т.о. на выходе получим - _черный_.
                А надо бы, все-таки, поближе к красному :)
                Вывод - решение _не_ верное.
                  Попробуй данный вариант прогнать через любой графический редактор и ты увидешь то же самое (Но с точным соблюдением цветовой палитры.) Такое преобразование используется всеми графическими редакторами и конверторами. Выходит, что они сами не правы??? А вданном случае ты имеешь цвет, который при переходе к 8 битной палитре превратится строго в черный ;D ;D ;D
                    Для более подробного ознакомления с цветами и преобразованиями советую почитать доки по Direct и по графическим форматам в MSDN ;D ;D ;D
                      На самом деле, оно делается примерно так.

                      1. Для всех точек уменьшаем глубину цвета тупым делением на 4 (сдвигом, естессно) их R, G и B компонент цвета.
                      2. производим сортировку полученных цветов и уменьшаем их количество, приравнивая близкие,  чтобы общее их число не превысило 256.
                      3. все цвета взад умножаем на 4.
                      4. пишем все это в BMP (а все прочие форматы графики - суть есть изврат, ересь и бесовщина ;)))

                      Причем можно это все сделать (исходя из формата BMP), не загружая картинки.
                      Просто загрузить RGB-компоненты палитры, затем провести преобразование,
                      затем, составив таблицу соответствия "старый номер цвета - новый номер цвета" ,
                      записать новый битмап.


                        усе правильно, :))
                        позволю себе уточнить кое-что
                        после шага 3 надо сформировать палитру из полученных 256 (или меньше) цветов и записывать в бмп уже ее. а вместо каждого цвета каждого пикселя писать его номер в палитре.

                          Цитата 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
                            К чему я тебя и подводил в сообщении #6 :)
                              Ну бывает ;)
                              Хотя сам вроде бы недавно тоько такой бодягой занимался ;D ;D ;D
                                Я не вчитывался, но кажется, это то, что нужно:
                                http://soft.ivanovo.ru/Linux/Gimp/Grokking-the-GIMP-v1.0/node84.html
                                  http://www.codenet.ru/progr/video/pallete.php
                                    Привет!!!

                                    Деление и сдвиг не совсем то чем стоет пользоваться :)
                                    Есть более оригинальный способ:
                                    Суть его описана на: http://www.codenet.ru/progr/video/pallete.php

                                    Но помоему у тебя эта ссылочка уже есть :)

                                    Сразу замечу, метод просто о ;D ;Dй, работает как зверь - быстро и сердито. Но есть одно но. Если не оптимезировать то на его работу as is надо памяти ~1.5-2.0Mb.

                                    Пока :)
                                    Сообщение отредактировано: GrAnd -
                                      Если кому интересно, я сегодня написал конвертилку 16 bit WAVE -> 8 bit WAVE. Очень просто делим на 256 и все... Работает. :-)
                                        для самого корректного преобразования к палитре (без использования шаблонных заливок, шума и других подобных методов) нужно создать табличку со всеми цветами, встретившимся в картинке, отобрать из них 256 самых встречаемых, а потом уже записывать изображение, записывая в результат номер цвета в полученной палитре (или номер цвета, максимально близкому к цвету из палитры)... способ провереный, кто-то даж енто в какую-то прогу затолкал... AdobePhotoshop, что ли, называется... :)
                                          Цитата asmer, 07.07.02, 20:44:47
                                          для самого корректного преобразования к палитре (без использования шаблонных заливок, шума и других подобных методов) нужно создать табличку со всеми цветами, встретившимся в картинке, отобрать из них 256 самых встречаемых, а потом уже записывать изображение, записывая в результат номер цвета в полученной палитре (или номер цвета, максимально близкому к цвету из палитры)... способ провереный, кто-то даж енто в какую-то прогу затолкал... AdobePhotoshop, что ли, называется... :)


                                          Ну а если у тебя на картинке есть что-то маленькое и цветом, который больше не встречается, тогда ты просто его потеряешь. Пример: 256 БОЛЬШИХ полос с уменьшением скажем зеленой составляющей и МАЛЕНЬКИЙ квадрат красного цвета.
                                            Пардон, по сылке которую дал Sourcer об этом как раз и сказано. Просто я ее только посмотрел.
                                              Цитата asmer, 07.07.02, 20:44:47
                                              для самого корректного преобразования к палитре (без использования шаблонных заливок, шума и других подобных методов) нужно создать табличку со всеми цветами, встретившимся в картинке, отобрать из них 256 самых встречаемых, а потом уже записывать изображение, записывая в результат номер цвета в полученной палитре (или номер цвета, максимально близкому к цвету из палитры)... способ провереный, кто-то даж енто в какую-то прогу затолкал... AdobePhotoshop, что ли, называется... :)

                                              В PhotoShop'е используется алгоритм простого сглаживания цветов, посредством обычного статистического анализа "встречаемости" цвета. И берутся там все существующие цвета и оттенки. Тем более, то что я описал как раз и используется в Adobe
                                              Сообщение отредактировано: GrAnd -
                                                Вообщем я делал все по следующему алгоритму, довольно просто и дает приличный результат
                                                L=sqrt((R^2+G^2+B^2)/3)
                                                таким вот образом вычисляем среднегеометрическое
                                                  Цитата
                                                  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битный бмп файл после палитры надо писать таблицу соответствия индексов пикселя - его цвету в палитре. Как эту таблицу формировать?
                                                  Сообщение отредактировано: oldm -
                                                    Цитата sourcer @
                                                    http://www.codenet.ru/progr/video/pallete.php

                                                    а кто-нибудь знает, как подобное применить для ARGB?
                                                      Вообще, по-хорошему, надо палитру делать кластеризацией. Например, методом K-средних.
                                                        Median Cut - это тоже что-то вроде кластеризации.
                                                        Для уменьшения работы можно при генерации цветового куба уменьшить глубину цвета. До 5 бит практически не заметно.
                                                        У всех этих методов обычно наблюдается один недостаток - выпуклая оболочка выбранных цветов не охватывает все имеющиеся цвета, в результате в некоторых областях не удается смешать цвета.
                                                        1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                                                        0 пользователей:


                                                        Рейтинг@Mail.ru
                                                        [ Script execution time: 0,1119 ]   [ 14 queries used ]   [ Generated: 10.07.25, 10:53 GMT ]