| Разработка и ромхакинг > Ромхакинг и программирование |
| tilemolester-палитра |
| << < (2/2) |
| Mr2:
--- Цитата: paul_met от 01 Ноябрь 2012, 15:00:37 --- Да причём здесь Молестер? Вырезаю палитру из файла с картинкой. сохраняю её в отдельный файл. Проверяю в Молестере - цвета отображаются корректно. В Кристале, загрузив туже палитру - неверно. --- Конец цитаты --- Сконвертил 2-х байтную палитру в *.act . Загрузил в кристал палитру в формате *.act всё пучком. Только не понял какой формат у кристала для 2-х байтовых палитр. --- Цитата: paul_met от 01 Ноябрь 2012, 15:20:12 --- Мне проще алгоритм перевода цвета из 3-х байт в 2-а байта узнать! Как это делается? --- Конец цитаты --- Я давно формат разбирал, уже не помню что к чему. |
| paul_met:
--- Цитата: Mr2 ---Только не понял какой формат у кристала для 2-х байтовых палитр. --- Конец цитаты --- В том то и дело. --- Цитата: Mr2 ---Я давно формат разбирал, уже не помню что к чему. --- Конец цитаты --- А доков не сохранилось? |
| Mr2:
Разобрался. У палитры кристала свой спец формат. Обходной манёвр: 1. Грузишь(import) свою палитру в формате *.act. 2. Сохраняешь(export) в *.pal После чего она успешно открывается в кристале. Обратный процесс: 1. Грузишь(import) палитру в *.pal. 2. Сохраняешь(export) в *.act 3. Конвертируешь(24 to 15) в 2-х байтную палитру. |
| paul_met:
--- Цитата: Mr2 ---Я не пользовался никогда кристалом, чем *.act не угодил? --- Конец цитаты --- С Act всё в порядке. Я сейчас спецификацию gbapal глянул, там обратный порядок байт используется. А в моей палитре прямой. Потому твоя прога и не правильно конвертирует его в act. В общем, прикрепил палитру и файл с картинкой. А так же пикчу, как это должно всё выглядеть в молестере. Попробуй конвертнуть мою палитру в act, чтобы цвета также корректно отображались как и на примере. |
| Mr2:
А вот и вторая версия конвертера! :wow: Работает с прямым порядком байт в 15bpp. Тестируем. |
| paul_met:
--- Цитата: Mr2 от 01 Ноябрь 2012, 21:11:30 ---А вот и вторая версия конвертера! :wow: Работает с прямым порядком байт в 15bpp. Тестируем. --- Конец цитаты --- Ты мне лучше алгоритм расскажи. А то не люблю консольные проги. |
| HoRRoR:
--- Цитата: paul_met от 01 Ноябрь 2012, 15:20:12 --- Мне проще алгоритм перевода цвета из 3-х байт в 2-а байта узнать! Как это делается? --- Конец цитаты --- http://en.wikipedia.org/wiki/High_Color Собственно, алгоритм прост — нормализовать цвет (value / 255), умножить на максимальное значение цвета в High Color (2^5-1 или 2^6-1, в зависимости от модели и цвета) и записать биты на их место. |
| paul_met:
--- Цитата: HoRRoR ---Собственно, алгоритм прост — нормализовать цвет (value / 255), умножить на максимальное значение цвета в High Color (2^5-1 или 2^6-1, в зависимости от модели и цвета) и записать биты на их место. --- Конец цитаты --- А можно на конкретном примере? Как из 40 88 50 получить AA 28? |
| HoRRoR:
В RGB888 (по байту на цвет) цвета распределены в промежутке [0; 255]. Мы их нормализуем, т.е. сужаем этот промежуток до [0; 1], для чего делим цвета на их максимальное значение. Таким образом, из (64, 136, 80) мы получаем (0.25, 0.53, 0.31). Далее нам надо «растянуть» нормализованные цвета на промежутки, которые используются в двухбайтовой модели. Для этого мы проводим обратную операцию — умножаем на максимальное значение. Тут всё зависит от модели: если это RGB555, то каждый цвет мы умножаем на 31. Если это RGB565, то зелёный мы умножим не на 31, а на 63. Получаем: RGB555(8, 16, 10) RGB565(8, 33, 10) Затем упаковываем эти значения в два байта. Тут тоже всё зависит от модели, а ещё от порядка байтов. Если разложить по битам получившиеся значения, будет следующее: RGB555(01000b, 10000b, 01010b) RGB565(01000b, 100001b, 01010b) Значения могут отличаться на единицу или более, поскольку округлял и могла потеряться точность. А дальше уже разберись, какая модель используется, какой порядок байтов, и куда эти биты записывать. |
| Mr2:
--- Цитата: paul_met от 01 Ноябрь 2012, 23:14:27 --- А то не люблю консольные проги. --- Конец цитаты --- Это как поездил на москвиче, теперь уже хочется ауди!? :lol: Тебе по делу или перед девками на районе выпендриваться? :) Можно добавить скрипт(список файлов и формат конвертирования), и будет лучше гуёвой! ^_^ |
| paul_met:
--- Цитата: HoRRoR ---Затем упаковываем эти значения в два байта. --- Конец цитаты --- А каким образом упаковываем? Палитра у меня с прямым порядком байт. Модель возьмём RGB555. --- Цитата: Mr2 ---Это как поездил на москвиче, теперь уже хочется ауди!? Тебе по делу или перед девками на районе выпендриваться? Можно добавить скрипт(список файлов и формат конвертирования), и будет лучше гуёвой! --- Конец цитаты --- Неуместное сравнение. Просто программа должна быть не только функциональной, но иметь достойный вид. Я понимаю, что некоторые делают в первую очередь для себя и чтобы она выполняла основную функцию - то бишь работала. Но если выкладывать прогу во всеобщее пользование, то она должна выглядеть достойно. Это всего лишь моё мнение конечно. |
| Mr2:
--- Цитата: paul_met от 02 Ноябрь 2012, 12:08:26 ---Но если выкладывать прогу во всеобщее пользование, то она должна выглядеть достойно. Это всего лишь моё мнение конечно. --- Конец цитаты --- Если есть время на бантики и рюшечки, то конечно с ними лучше. Согласен. ;) |
| HoRRoR:
--- Цитата ---А каким образом упаковываем? Палитра у меня с прямым порядком байт. Модель возьмём RGB555. --- Конец цитаты --- Два байта - это 16 бит. Выставляем первые 5 бит в значение R, следующие - в G, затем в B, последний бит не используется. На C++ достаточно было бы создать структуру с битовыми полями: --- Код: ---struct RGB555 { unsigned short r: 5; unsigned short g: 5; unsigned short b: 5; unsigned short a: 1; }; --- Конец кода --- Иначе — с помощью операций сдвига и логического или. --- Код: ---unsigned short color = 0; color = ((r & 0x1F) << 11) | ((g & 0x1F) << 6) | ((b & 0x1F) << 1); --- Конец кода --- Мог ошибиться. И не помню точно, какой бит не используется - старший или младший. В примере - младший. |
| paul_met:
HoRRoR А если пойти от обратного? То, если я правильно понял получается: --- Код: ---Берем конечный результат в (hex): AA 28 ---------------------------------------- Переводим в bin: 10101 01000 10100 0 ---------------------------------------- Разбиваем по 5 бит (последний не учитываем): R=10101 G=01000 B=10100 ---------------------------------------- Переводим полученное в dec: R=21 G=8 B=20 ---------------------------------------- Делим на 31 и умножаем на 255 и получаем: R=173 G=66 B=166 ---------------------------------------- А начальное значение было: R=64 G=136 B=80 ---------------------------------------- Вывод: Не сходится. --- Конец кода --- |
| HoRRoR:
Либо это разные цвета, либо не та модель, либо не тот порядок байтов, либо ошибка в вычислениях. Попробуй по-разному, всего 6 вариантов: 1. RGB555, little endian, не используется старший бит 2. RGB555, little endian, не используется младший бит 3. RGB555, big endian, не используется старший бит 4. RGB555, big endian, не используется младший бит 5. RGB565, little endian 6. RGB565, big endian Каждый из них даст совершенно разные результаты. Либо вообще какая-то своя модель. Я ж не знаю, что там у тебя. Добавлено позже: norm(64, 136, 80) = (0.25, 0.53, 0.31) (0.25, 0.53, 0.31) * 31 = (8, 17, 10) bin(8, 17, 10) = (01000, 10001, 01010) А 0xAA28 в RGB555 с младшим неиспользуемым битом равно (1, 01010, 10001, 01000), т.е., видимо, модель ABGR1555, либо же я запутался с порядком. |
| paul_met:
--- Цитата: HoRRoR ---видимо, модель ABGR1555, либо же я запутался с порядком. --- Конец цитаты --- Точно, так и есть - это BGR. |
| Навигация |
| Главная страница сообщений |
| Предыдущая страница |