Page 2 of 7

Re: libimg

Posted: Sat May 26, 2012 8:05 pm
by Freeman
dunkaist
В английской Википедии вроде вполне подробное описание формата, даже с разбиением на версии. Отсылка к BITMAPINFOHEADER -- и есть документация Microsoft, далее по ссылкам.

Re: libimg

Posted: Sat May 26, 2012 9:39 pm
by dunkaist
Freeman, ты же сам прекрасно понимаешь, чем спецификация от описания отличается. По ссылкам я сходил.

Всё оказалось проще. Структуры были описаны в bmp.inc довольно хитрым образом, поэтому длины для проверки вбивались руками. Не все варианты были учтены.

Но после этого 3х5 картинка всё равно не захотела открываться из-за бага в img.flip.layer. Заменил цикл с постусловием на цикл с предусловием. Вроде, всё работает.

Re: libimg

Posted: Sun May 12, 2013 12:55 am
by dunkaist
Коротко об изменениях в библиотеке за прошедший год:
  • Добавлены типы изображений, поддерживаемые 65-й функцией: grayscale, 2-х и 4-х битные типы с палитрой.
  • Появилась поддержка некоторых расширений формата tiff. Из заметных глазу можно отметить чтение lzw-сжатых изображений.
  • Новые функции: img.scale и img.convert для масштабирования изображения и преобразования его представления (глубины цвета и т.д.)
  • Существенно обновлён декодер tga, поддержка нового формата xbm (XBitMap).
  • Исправлены некоторые баги, убран лимит на размер декодированного изображения.
Прежняя просьба прикреплять изображения, которые не открываются или отображаются неправильно.

Re: libimg

Posted: Sun May 12, 2013 1:10 am
by Mario_r4
dunkaist wrote:[*]Добавлены типы изображений, поддерживаемые 65-й функцией: grayscale, 2-х и 4-х битные типы с палитрой.
Из опыта проектирования и реализации zSea могу посоветовать переделать с конвертированием в 8-и битное. В дальнейшем с размерностями не кратными байту возникают проблемы с выводом - например, с прокруткой больших или сильно масштабирован изображений. Приходится либо прокручивать на количество точек содержащееся в одном байте за транзакцию, либо использовать все в кратном байту разрешении.

Re: libimg

Posted: Sun May 12, 2013 1:45 am
by dunkaist
Mario_r4 wrote:Из опыта проектирования и реализации zSea могу посоветовать переделать с конвертированием в 8-и битное. В дальнейшем с размерностями не кратными байту возникают проблемы с выводом - например, с прокруткой больших или сильно масштабирован изображений. Приходится либо прокручивать на количество точек содержащееся в одном байте за транзакцию, либо использовать все в кратном байту разрешении.
Да, действительно, отступ внутри байта никак не задать. Думаю, перекодировать имеет смысл просмотрщику, который захочет, скажем, масштабировать (всё равно масштабирование для 2-х бит я писать не буду). Как раз для этого img.convert появилась. Но совсем переписывать смысла не вижу, ведь если есть файлы в таких форматах и их вывод поддерживается ядром, то пусть и libimg умеет с ними "нативно" работать.

У меня сейчас другой вопрос: как отображать иконки, если они не влезают в окно? Допустим, есть иконка, в ней семь фреймов, по длине не умещаются в окно.

Пусть ширина всех фреймов вместе -- 707 пикселей, иконки одинаковые.

Первый случай: ширина области, куда можно рисовать -- 700 пикселей. Масштабировать каждую на -1 пиксель? Мыло, но ещё куда ни шло.
Второй случай: ширина области для рисования -- 704 пикселя. Всё равно масштабировать каждую на -1? Или только три из них? Но это будет выглядеть странно, т.к. все иконки одинаковые, но часть отображается нормально, а часть замылена.

Re: libimg

Posted: Sun May 12, 2013 1:55 am
by Mario_r4
dunkaist wrote: У меня сейчас другой вопрос: как отображать иконки, если они не влезают в окно? Допустим, есть иконка, в ней семь фреймов, по длине не умещаются в окно.

Пусть ширина всех фреймов вместе -- 707 пикселей, иконки одинаковые.

Первый случай: ширина области, куда можно рисовать -- 700 пикселей. Масштабировать каждую на -1 пиксель? Мыло, но ещё куда ни шло.
Второй случай: ширина области для рисования -- 704 пикселя. Всё равно масштабировать каждую на -1? Или только три из них? Но это будет выглядеть странно, т.к. все иконки одинаковые, но часть отображается нормально, а часть замылена.
Скроллбар использовать религия запрещает?

Re: libimg

Posted: Sun May 12, 2013 2:00 am
by dunkaist
Mario_r4 wrote:Скроллбар использовать религия запрещает?
Я имею в виду режим масштабирования изображения под размер окна. В таком режиме по определению всё должно вмещаться в окно без всяких скроллбаров.

Дело в том, что у меня нет под рукой просмотрщиков, которые бы показывали иконки в ряд. Если кто-нибудь пользуется такими, было бы интересно узнать, как они ведут себя в такой ситуации.

Re: libimg

Posted: Sun May 12, 2013 2:16 am
by Mario_r4
dunkaist wrote:В таком режиме по определению всё должно вмещаться в окно без всяких скроллбаров.
Имеет смысл масштабировать общее изображение, на котором все иконки. Плевать на замыленность - пользователь ССЗБ, раз выбрал такой режим.

Re: libimg

Posted: Sun May 12, 2013 3:10 am
by Leency
Не нужно маштабировать иконки. Лучше обрезать или выводить в 2 ряда.
Очень не хватает в kiv функции, которая есть в zSea, - "вписать в окно". Из-за этого в kiv, а значит в Колибри в общем, просто невозможно смотреть фотографии.

Re: libimg

Posted: Mon Mar 24, 2014 12:20 am
by Leency
Наверно я чтото делаю не так...

> WebView
> нужно сделать загрузку цветов из скина
Есть код:

Code: Select all

skin.image = load_image(abspath("wv_skin.png"));
skin.w = DSWORD[skin.image+4];
skin.h = DSWORD[skin.image+8];
img_draw stdcall(skin.image, 0, 0, skin.w, skin.h, 101, 0); //вывести изображение
Изображение прекрасно выводится. НО.
Как я могу получить цвет первого пикселя из этого изображения? Следующий код не работает.

Code: Select all

first_pixel_color = DSDWORD[skin.image+12];
first_pixel_color = DSDWORD[skin.image+30];

Re: libimg

Posted: Mon Mar 24, 2014 12:44 am
by Mario_r4
Leency wrote:Наверно я чтото делаю не так...

> WebView
> нужно сделать загрузку цветов из скина
Есть альтернативный способ, котором пользуется большинство разработчиков. Можно положить в ту же директорию, где лежит файл скина, еще и INI файл (например, skin.ini) и воспользоваться сервисами LibINI.

Re: libimg

Posted: Mon Mar 24, 2014 1:31 am
by hidnplayr
Leency wrote:Наверно я чтото делаю не так...

> WebView
> нужно сделать загрузку цветов из скина
Есть код:

Code: Select all

skin.image = load_image(abspath("wv_skin.png"));
skin.w = DSWORD[skin.image+4];
skin.h = DSWORD[skin.image+8];
img_draw stdcall(skin.image, 0, 0, skin.w, skin.h, 101, 0); //вывести изображение
Изображение прекрасно выводится. НО.
Как я могу получить цвет первого пикселя из этого изображения? Следующий код не работает.

Code: Select all

first_pixel_color = DSDWORD[skin.image+12];
first_pixel_color = DSDWORD[skin.image+30];
Colors are 24-bit, need to do logical AND with 0x00ffffff.
Also possible that it's required to swap colors from "BGR" to "RGB" but i'm not sure.

Re: libimg

Posted: Mon Mar 24, 2014 1:08 pm
by dunkaist
Leency,

DSDWORD[skin.image+24] -- это указатель на raw изображение

Не знаю, что за DSDWORD, но думаю, что следующий псевдокод разъяснит:

Code: Select all

pixel *raw = DSDWORD[skin.image+24];   // указатель на пиксели
first_pixel_color = raw[0];

Re: libimg

Posted: Mon Mar 24, 2014 1:12 pm
by Leency
О, спасибо. Попробую.

Re: libimg

Posted: Mon Mar 24, 2014 11:58 pm
by Leency
col_bg = DSDWORD[skin.image+24];
Сделал, получаю цвет 105000 вместо E4DFE1.
В чём может быть проблема?

строка $and col_bg, 0x00ffffff ничего не меняет.
Я не понимат T_T