Board.KolibriOS.org
http://board.kolibrios.org/

libimg
http://board.kolibrios.org/viewtopic.php?f=24&t=1728
Page 2 of 5

Author:  Freeman [ Sat May 26, 2012 8:05 pm ]
Post subject:  Re: libimg

dunkaist
В английской Википедии вроде вполне подробное описание формата, даже с разбиением на версии. Отсылка к BITMAPINFOHEADER -- и есть документация Microsoft, далее по ссылкам.

Author:  dunkaist [ Sat May 26, 2012 9:39 pm ]
Post subject:  Re: libimg

Freeman, ты же сам прекрасно понимаешь, чем спецификация от описания отличается. По ссылкам я сходил.

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

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

Author:  dunkaist [ Sun May 12, 2013 12:55 am ]
Post subject:  Re: libimg

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

Прежняя просьба прикреплять изображения, которые не открываются или отображаются неправильно.

Author:  Mario_r4 [ Sun May 12, 2013 1:10 am ]
Post subject:  Re: libimg

dunkaist wrote:
[*]Добавлены типы изображений, поддерживаемые 65-й функцией: grayscale, 2-х и 4-х битные типы с палитрой.

Из опыта проектирования и реализации zSea могу посоветовать переделать с конвертированием в 8-и битное. В дальнейшем с размерностями не кратными байту возникают проблемы с выводом - например, с прокруткой больших или сильно масштабирован изображений. Приходится либо прокручивать на количество точек содержащееся в одном байте за транзакцию, либо использовать все в кратном байту разрешении.

Author:  dunkaist [ Sun May 12, 2013 1:45 am ]
Post subject:  Re: libimg

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

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

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

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

Author:  Mario_r4 [ Sun May 12, 2013 1:55 am ]
Post subject:  Re: libimg

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

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

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

Скроллбар использовать религия запрещает?

Author:  dunkaist [ Sun May 12, 2013 2:00 am ]
Post subject:  Re: libimg

Mario_r4 wrote:
Скроллбар использовать религия запрещает?
Я имею в виду режим масштабирования изображения под размер окна. В таком режиме по определению всё должно вмещаться в окно без всяких скроллбаров.

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

Author:  Mario_r4 [ Sun May 12, 2013 2:16 am ]
Post subject:  Re: libimg

dunkaist wrote:
В таком режиме по определению всё должно вмещаться в окно без всяких скроллбаров.

Имеет смысл масштабировать общее изображение, на котором все иконки. Плевать на замыленность - пользователь ССЗБ, раз выбрал такой режим.

Author:  Leency [ Sun May 12, 2013 3:10 am ]
Post subject:  Re: libimg

Не нужно маштабировать иконки. Лучше обрезать или выводить в 2 ряда.
Очень не хватает в kiv функции, которая есть в zSea, - "вписать в окно". Из-за этого в kiv, а значит в Колибри в общем, просто невозможно смотреть фотографии.

Author:  Leency [ Mon Mar 24, 2014 12:20 am ]
Post subject:  Re: libimg

Наверно я чтото делаю не так...

> WebView
> нужно сделать загрузку цветов из скина
Есть код:
Code:
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:
first_pixel_color = DSDWORD[skin.image+12];
first_pixel_color = DSDWORD[skin.image+30];

Author:  Mario_r4 [ Mon Mar 24, 2014 12:44 am ]
Post subject:  Re: libimg

Leency wrote:
Наверно я чтото делаю не так...

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

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

Author:  hidnplayr [ Mon Mar 24, 2014 1:31 am ]
Post subject:  Re: libimg

Leency wrote:
Наверно я чтото делаю не так...

> WebView
> нужно сделать загрузку цветов из скина
Есть код:
Code:
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:
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.

Author:  dunkaist [ Mon Mar 24, 2014 1:08 pm ]
Post subject:  Re: libimg

Leency,

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

Не знаю, что за DSDWORD, но думаю, что следующий псевдокод разъяснит:
Code:
pixel *raw = DSDWORD[skin.image+24];   // указатель на пиксели
first_pixel_color = raw[0];

Author:  Leency [ Mon Mar 24, 2014 1:12 pm ]
Post subject:  Re: libimg

О, спасибо. Попробую.

Author:  Leency [ Mon Mar 24, 2014 11:58 pm ]
Post subject:  Re: libimg

col_bg = DSDWORD[skin.image+24];
Сделал, получаю цвет 105000 вместо E4DFE1.
В чём может быть проблема?

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

Page 2 of 5 All times are UTC+03:00
Powered by phpBB® Forum Software © phpBB Limited
https://www.phpbb.com/