Быстрый декод JPEGа и biCompression=BI_JPEG
От: SergV6  
Дата: 23.12.07 23:14
Оценка:
Нужно быстро загрузить и показать Ne количество JPEG файлов. Приемлемым резултатом (для меня) это 4-5 файлов по 4MB/10Mpx в секунду на Core2 Duo E2140 ...

опробовал — стандартный GDI+ Bitmap::FromFile(), весьма тормознуто — 50 сек на 100 циклов
libjpeg и cximage — около 30 сек на 100 циклов
Acdsee показывает в status bar'е не более 0.20 сек на файл, т.е. максимум 20 сек на 100 циклов — не знаю на сколько это правда, но субъективно и в самом деле весьма шустро

хотелось бы получить результат как в Acdsee

И на тему biCompression=BI_JPEG (про который MSDN пишут что вроде как работает в XP). Хотел проверить на каком же этапе так жутко тормозит родной виндовый GDI. Хотел сам загрузить JPG content из файлы и скормить в CreateDIBSection(biCompression = BI_RGB)->SetBitmapBits() но для этого нужно как-то добыть из файла JPG заголовок чтобы вызвать CreateDIBSection() а затем и сам JPG stream для SetBitmapBits() ... ничего из примеров как это сделать не нашёл ни в MSDN ни в гугле ни здесь

Да и вообще интересно будет ли выводиться на экран DIB с BI_JPEG вот таким способом или нет


    void CChildView::OnPaint() 
    {
        CPaintDC dc(this);
        CDC      bmDC;
        
        bmDC.CreateCompatibleDC(&dc);
        SelectObject(bmDC.m_hDC, m_hbm); // <-- где m_hbm это DIB c biCompression=BI_JPEG

        dc.StretchBlt(100, 100, 800, 600, &m_bmDC, 500, 500, 400, 300, SRCCOPY);
    }



ЗЫ:


    Bitmap* bmp = Bitmap::FromFile(L"C:\\My.jpg");
    HBITMAP  hbm;
    DIBSECTION  dib;

    bmp->GetHBITMAP(c, &hbm);
    ::GetObject(hbm, sizeof(DIBSECTION), &dib);

и вот здесь в dib.dsBmih.biCompression уже лежит 0 (он же BI_RGB) а не BI_JPEG.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.