Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Кто работал с libpng отзовитесь 
:(
    Опции темы
deniska
Дата 3.9.2007, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



Нужно: обработать png файл и на выходе получить RGBA массив, который может проглотить AlphaBlend. Пока получилось следующее:
Код

    FILE* file = fopen("test.png", "rb");
    // unable to open
    if (file)
    {
        // create read struct
        png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, 0, 0, 0);
        // create info struct
        png_infop info_ptr = png_create_info_struct(png_ptr);

        png_init_io(png_ptr, file);
        // read entire image (high level)
        png_read_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY , 0);//PNG_TRANSFORM_EXPAND
        fclose(file);

        if(info_ptr->valid & PNG_INFO_IDAT && info_ptr->pixel_depth==32)
        {
            BYTE* lpBuf;
            lpBuf = new BYTE[info_ptr->width*info_ptr->height*info_ptr->channels];
            BYTE * lp = lpBuf;
            BYTE* p = *info_ptr->row_pointers;
            for( int i = 0; i < info_ptr->width*info_ptr->height*info_ptr->channels; i++ )
            {
                *lp = *p;
                lp++;
                p++;
            }
            CBitmap bm;
            bm.CreateBitmap( info_ptr->width, info_ptr->height, 1, info_ptr->channels*info_ptr->bit_depth, lpBuf );
            CDC dc;
            dc.CreateCompatibleDC( 0 );
            HGDIOBJ oldbm = dc.SelectObject( bm );
            CDC* pdc = GetDC();
            BLENDFUNCTION bl;
            bl.AlphaFormat = AC_SRC_ALPHA;
            bl.BlendFlags = 0;
            bl.BlendOp = AC_SRC_OVER;
            bl.SourceConstantAlpha = 255;
            pdc->AlphaBlend( 0,0, info_ptr->width, info_ptr->height, &dc, 0,0, info_ptr->width, info_ptr->height, bl);
            ReleaseDC( pdc );
            dc.SelectObject( oldbm );
            delete [] lpBuf;
            lpBuf = NULL;
        }
        png_destroy_read_struct(&png_ptr, &info_ptr, 0);
        return;
    }else
    {
        return;
    }
 

Что получается- смотрим на картинку.

Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  bad.rar 102,71 Kb
PM MAIL ICQ   Вверх
deniska
Дата 4.9.2007, 10:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



http://www.codeproject.com/useritems/transparent__png.asp
Нашел единственный рабочий пример, реализующий прозрачность, но там вся соль в небольшом куске asma, в котором я не бум-бум :(, к тому же там все-таки AlphaBlend не используется. если есть люди кому интересно разобраться с нормальным выводом png и знающие хоть немного asm присоединяйтесь. а пока буду юзать так :((((
PM MAIL ICQ   Вверх
JackYF
Дата 4.9.2007, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


полуавантюрист
****


Профиль
Группа: Участник
Сообщений: 5814
Регистрация: 28.8.2004
Где: страна тысячи озё р

Репутация: нет
Всего: 162



Ну ни хрена себе... да, поизвращались люди. Там надо время убивать, чтоб разобраться, что же тот кусок делает...


--------------------
Пожаловаться на меня как модератора можно здесь.
PM MAIL Jabber   Вверх
Nastya
Дата 6.9.2007, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 27.3.2002
Где: Мариуполь

Репутация: 3
Всего: 44



Сорри, а что есть libpng и не лучше ли использовать GDI + и не мучатся?


--------------------
Что бы понять рекурсию, надо понять рекурсию

"Профессионал - это человек сделавший все возможные ошибки в очень узкой области". Н.Бор
PM MAIL   Вверх
zkv
Дата 6.9.2007, 09:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Участник Клуба
Сообщений: 2133
Регистрация: 23.7.2006
Где: Санкт-Петербург

Репутация: 12
Всего: 92



Цитата(Nastya @  6.9.2007,  08:51 Найти цитируемый пост)
и не лучше ли использовать GDI + и не мучатся? 

оно хорошо конечно, только если требуется загрузить/сохранить, и не шагу влево. С пнг особо не работал, но по жепегу помню, что даже качество задать не получилось (хотя может плохо смотрел), не говоря о том, чтобы что-нить в методиках кодирования/декодирования скорректировать.
PM MAIL   Вверх
deniska
Дата 6.9.2007, 11:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 398
Регистрация: 1.7.2005
Где: Троицк

Репутация: нет
Всего: 0



Цитата

Сорри, а что есть libpng и не лучше ли использовать GDI + и не мучатся? 

PNG определенный формат файла. В нем используется сжатие данных определенным способом, да и структура файла у него своеобразная.
а библиотека о которой я говорил, грубо говоря, берет в себя имя файла, парсит его и выдает массив RGBA элементов (на сколько я понял smile)
GDI + - тоже библиотека но с пнг форматом нормально работать не умеет. Хотя может я где-то наврал. поправьте если что
PM MAIL ICQ   Вверх
Brodyaga
Дата 29.11.2009, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 599
Регистрация: 19.1.2008

Репутация: нет
Всего: 2



А можно ли както с помощью libpng вывести на канву пнгшку? или наоборот с канвы массив байт сконвертить в пнг файл?
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0474 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.