Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > API для загрузки JPG


Автор: Fixin 29.12.2004, 21:25
Наверное уже спрашивали, но мне немножко(очень) некогда. Подскажите функции для загрузки jpg в HBITMAP. Если нет стандартных вызовов системной ф-ции, то мне проще преобразовать картинки в bmp.

Автор: chipset 29.12.2004, 21:27
GDI+ пойдет?
CImage класс.
В WInApi таких функций нету.. афаик.

Автор: Fixin 29.12.2004, 21:28
Подойдет!!!

Автор: chipset 29.12.2004, 21:30
VC7.1 должен быть.
Смотри в MSDN по CImage.

Автор: Fixin 29.12.2004, 21:32
Еще что есть?
Добавлено @ 21:33
Внешние библиотеки?
Добавлено @ 21:34
CImage нет - VC5 - нового найти не могу

Автор: chipset 29.12.2004, 21:37
http://sources.ru/cpp/cpp_class_for_jpeg.shtml

Автор: Fixin 29.12.2004, 21:41
Сенькваю!
Добавлено @ 21:49
У меня скорость 5kbs, а библиотека на 2.5 Мb. Может что по-проще?

Автор: chipset 29.12.2004, 21:54
И правда, что это я..
http://rsdn.ru/article/qna/gdi/drawimg.xml smile

Автор: DENNN 30.12.2004, 12:23
загружаем
Код

bool LoadPictFromFile(IPicture** gpPicture, const char *szFile)
{
bool pict_loaded;
       if (gpPicture)
                gpPicture->Release();
*gpPicture=0;
pict_loaded=false;

// open file
HANDLE hFile = ::CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
if (INVALID_HANDLE_VALUE == hFile)
 return false;

// get file size
DWORD dwFileSize = ::GetFileSize(hFile, NULL);
if ( -1 == dwFileSize )
{
 CloseHandle(hFile);
 return false;
}

LPVOID pvData = NULL;
// alloc memory based on file size
HGLOBAL hGlobal = ::GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
if (NULL == hGlobal)
{
 _ASSERTE(NULL != hGlobal);
 ::CloseHandle(hFile);
 return false;
}

pvData = GlobalLock(hGlobal);
if (NULL == pvData)
{
       _ASSERTE(NULL != pvData);
 ::GlobalFree(hGlobal);
 ::CloseHandle(hFile);
 return false;
}

DWORD dwBytesRead = 0;
// read file and store in global memory
BOOL bRead = ::ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
::CloseHandle(hFile);
if (FALSE == bRead || dwFileSize!=dwBytesRead)
{
 ::GlobalUnlock(hGlobal);
 ::GlobalFree(hGlobal);
 return false;
}

LPSTREAM pstm = NULL;
// create IStream* from global memory
HRESULT hr = ::CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
if (!SUCCEEDED(hr) || !pstm)
{
 ::GlobalUnlock(hGlobal);
 ::GlobalFree(hGlobal);
 return false;
}

// Create IPicture from image file
hr = ::OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (LPVOID*) gpPicture);
pstm->Release();
if (!SUCCEEDED(hr) || !gpPicture)
{
 *gpPicture=0;
 pict_loaded=false;
}
else
 pict_loaded=true;

::GlobalUnlock(hGlobal);
::GlobalFree(hGlobal);

return pict_loaded;
}

Теперь, когда в объекте IPicture у нас есть загруженное изображение, то можно его вывести на экран
Код

#define HIMETRIC_INCH 2540
#define MAP_LOGHIM_TO_PIX(x,ppli)   ( ((ppli)*(x) + HIMETRIC_INCH/2) / HIMETRIC_INCH )
IPicture* gpPicture;
.....
LoadPictFromFile(...........);
.....
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
 case WM_PAINT:
  hdc = BeginPaint(hWnd, &ps);
  if (gpPicture)
  {
   // get width and height of picture
   long hmWidth;
   long hmHeight;
   gpPicture->get_Width(&hmWidth);
   gpPicture->get_Height(&hmHeight);
   // convert himetric to pixels
   int nWidth = MulDiv(hmWidth, GetDeviceCaps(hdc, LOGPIXELSX), HIMETRIC_INCH);
   int nHeight = MulDiv(hmHeight, GetDeviceCaps(hdc, LOGPIXELSY), HIMETRIC_INCH);
   RECT rc;
   GetClientRect(hWnd, &rc);
   // display picture using IPicture::Render
   gpPicture->Render(hdc, 0, 0, nWidth, nHeight, 0, hmHeight, hmWidth, -hmHeight, &rc);
   
  };
  EndPaint(hWnd, &ps);
  break;
}


Естественно, точно также можно "отрендерить" картинку в свой DC с выбранным в нем HBITMAP

Автор: Mad 30.12.2004, 12:58
Fixinlibjpeg

Автор: Fixin 1.1.2005, 16:54
DENNN
Огромное спасибо тебе и всем остальным - все работает! Только:

Код

bool LoadPictFromFile(IPicture** gpPicture, const char *szFile)
{
bool pict_loaded;
    if (*gpPicture)
         (*gpPicture)->Release();
...
}

Автор: _hunter 1.1.2005, 19:16
только что? ;)

Автор: Fixin 1.1.2005, 19:20
Сравни начала кодов - в условии звездочка и после(у меня без этого не работало). smile

Автор: _hunter 1.1.2005, 23:44
понятно.
просто когда пишут "только" обычно дальше ( за текстом ) идет объяснение.
но это все мелочи smile

Автор: Fixin 1.1.2005, 23:50
_hunter
Извини.
У меня инет дома - платить приходится. А за то, что делал его бесплатным заплатил прикольный штраф - вычислили по номеру телефона, хотя мучались аж 2 недели. Я и не думал, что для "НИХ" это окажется сложным
Добавлено @ 23:50
smile
Добавлено @ 23:51
А что ты еще тут?
Добавлено @ 23:52
Я и не думал, что тема долго провисит - думал пошлют в ФАКу

Автор: Alexandr87 16.1.2005, 07:08
Им наверное просто было в лом. Потому что при диалапе твой номер светиться на все 100%, и ниче вычислять не надо - взял да посмотрел.

Автор: Fixin 16.1.2005, 16:34
Так я им чужой номер посылал - в том и прикол, точнее 6 нулей.

Автор: chipset 16.1.2005, 16:47
Неплохо бы вернуться к теме обсуждения smile

Автор: IEZ 13.2.2005, 13:54
В интернете есть исходники класса CxImage. Я думаю он бы тебе подошел.
Там полная работа с графическими форматами. У меня есть архивы, но они около 1.5 MB.
Если хочешь могу сбросить на мыло. Соответственно давай адрес. smile

Автор: Fixin 13.2.2005, 15:31
Вот адрес: ivbaturin@mail.ru. Если можно, то по кускам подели архив, а то со скоростью проблемки smile . Спасибо, старая темка-то.

Автор: IEZ 14.2.2005, 10:50
Fixin Проверяй мыло. smile

Автор: Fixin 14.2.2005, 18:44
Спасибо. Классный ты парень! smile

Автор: Fixin 6.8.2005, 23:21
Вот немножко улучшенный (ИМХО, не смотрел - сейчас бы лучше сделал) вариант:
Код
#ifndef OLEBMP_H
#define OLEBMP_H
#include <windows.h>
#include <olectl.h>

#define HIMETRIC_INCH 2540

typedef
class tagOleBitmap
{
private:
    IPicture* gpPicture;
public:
    tagOleBitmap()
    {
        gpPicture = 0;
    }
    ~tagOleBitmap()
    {
        if (Ready())
            Release();
    }
    BOOL Load(char* szFile);
    void BitBlt(HDC PaintDC, int x = -1, int y = -1, int cx = -1, int cy = -1);
    BOOL Ready();
    void Release();
} OBMLoad;

BOOL 
tagOleBitmap::Load(char* szFile)
{
    Release();
    HANDLE hFile = CreateFile(szFile, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (INVALID_HANDLE_VALUE == hFile)
        return false;
    DWORD dwFileSize = GetFileSize(hFile, NULL);
    if ( -1 == dwFileSize )
    {
        CloseHandle(hFile);
        return false;
    }
    LPVOID pvData = NULL;
    HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize);
    if (NULL == hGlobal)
    {    
        CloseHandle(hFile);
        return false;
    }
    pvData = GlobalLock(hGlobal);
    if (NULL == pvData)
    {
        GlobalFree(hGlobal);
        CloseHandle(hFile);
        return false;
    }
    DWORD dwBytesRead = 0;
    BOOL bRead = ReadFile(hFile, pvData, dwFileSize, &dwBytesRead, NULL);
    CloseHandle(hFile);
    if (FALSE == bRead || dwFileSize!=dwBytesRead)
    {
        GlobalUnlock(hGlobal);
        GlobalFree(hGlobal);
        return false;
    }
    LPSTREAM pstm = NULL;
    HRESULT hr = CreateStreamOnHGlobal(hGlobal, TRUE, &pstm);
    if (!SUCCEEDED(hr) || !pstm)
    {
        GlobalUnlock(hGlobal);
        GlobalFree(hGlobal);
        return false;
    }
    hr = OleLoadPicture(pstm, dwFileSize, FALSE, IID_IPicture, (void**)(&gpPicture));
    pstm->Release();
    if (!SUCCEEDED(hr) || !gpPicture)
    {
        gpPicture=0;
        GlobalUnlock(hGlobal);
        GlobalFree(hGlobal);
        return FALSE;
    }
    GlobalUnlock(hGlobal);
    GlobalFree(hGlobal);
    return TRUE;
}

void 
tagOleBitmap::BitBlt(HDC PaintDC, int x, int y, int cx, int cy)
{
    if (!Ready())
        return;
    long hmWidth;
    long hmHeight;
    gpPicture->get_Width(&hmWidth);
    gpPicture->get_Height(&hmHeight);
    if (cx == -1)
        cx = MulDiv(hmWidth, GetDeviceCaps(PaintDC, LOGPIXELSX), HIMETRIC_INCH);
    if (cy == -1)
        cy = MulDiv(hmHeight, GetDeviceCaps(PaintDC, LOGPIXELSY), HIMETRIC_INCH);
    if (x == -1)
        x = 0;
    if (y == -1)
        y = 0;
    gpPicture->Render(PaintDC, x, y, cx, cy, 0, hmHeight, hmWidth, -hmHeight, NULL);
}

BOOL 
tagOleBitmap::Ready()
{
    return (gpPicture != 0);
}

void 
tagOleBitmap::Release()
{
    if (Ready())
        gpPicture->Release();
}
#endif

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)