Сохранение JPEG с бикубической интерполяцией и изменением ра
От: RevSegment  
Дата: 16.03.06 14:14
Оценка:
Доброго времени суток!
Пытаюсь реализовать сабж, но не знаю, с чего начать.
Получилось изменить размеры и сохранить картинку в формате bmp, после чего я ее конвертил в JPEG при помощи ATL класса .

Вопрос 1 — как можно изменить размер картинки и сохранить ее только используя ?
Мучался с StretchBlt — так и не получилось (
Вопрос 2 — можно ли при помощи CImage сохранять изображения с приминением бикубической интерполяции?

Вот код, который я использую:

DEFINE_GUID(ImageFormatJPEG, 0xb96b3cae,0x0728,0x11d3,0x9d,0x7b,0x00,0x00,0xf8,0x1e,0xf3,0x2e);
#define HIMETRIC_INCH   2540    // HIMETRIC units per inch

    // Загрузка изображения
    CComPtr<IPicture> m_pPicture;
    HRESULT hr = ::OleLoadPicturePath(L"3.jpg", NULL, 0, 0, IID_IPicture,(void**)&m_pPicture);
    if (FAILED(hr))
    {
        MessageBox("error",0,0);
        return 0;
    }
    
    long hmWidth = 0, hmHeight = 0;
    m_pPicture->get_Width(&hmWidth);
    m_pPicture->get_Height(&hmHeight);

    RECT rc = {0, 0, 800, 600};
    
    HDC dc = ::GetDC(0);
    HDC memDC = ::CreateCompatibleDC(dc);

    HBITMAP bm = ::CreateCompatibleBitmap(dc, (rc.right-rc.left), (rc.bottom-rc.top));
    HBITMAP oldbm = (HBITMAP) ::SelectObject(memDC, bm);
    ::ReleaseDC(0, dc);

    hr = m_pPicture->Render(
            memDC,                            // [in] Handle of device context on which to render the image
            rc.left,                        // [in] Horizontal position of image in hdc
            rc.top,                            // [in] Vertical position of image in hdc
            rc.right - rc.left,                // [in] Horizontal dimension of destination rectangle
            rc.bottom - rc.top,                // [in] Vertical dimension of destination rectangle
            0,                                // [in] Horizontal offset in source picture
            hmHeight,                        // [in] Vertical offset in source picture
            hmWidth,                        // [in] Amount to copy horizontally in source picture
            -hmHeight,                        // [in] Amount to copy vertically in source picture
            NULL                            // [in, optional] Pointer to position of destination for a metafile hdc
            );
        ::SelectObject(memDC, oldbm);
        ::DeleteDC(memDC);

    // Сохранение изображения
    PICTDESC PictDesc;
    PictDesc.cbSizeofstruct = sizeof(PICTDESC);
    PictDesc.picType = PICTYPE_BITMAP;
    PictDesc.bmp.hbitmap = bm;
    PictDesc.bmp.hpal = NULL;
    IPicture* iPic;
    OleCreatePictureIndirect(&PictDesc, IID_IDispatch, FALSE, (LPVOID*) &iPic);

    CComBSTR bstrFile = "1.bmp";
    OleSavePictureFile((IDispatch*)iPic, bstrFile);
    iPic->Release();

    CImage f;
    f.Load("1.bmp");
    f.Save("1.jpg",ImageFormatJPEG);
    DeleteFile("1.bmp");


Помогите разобраться плиз.
Спасибо.
... опыт приходит во время боя ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.