Изменение размеров изображения в формате JPEG или PNG


Функция StretchDIBits копирует данные о цвете для прямоугольника пикселей в аппаратно-независимом растровом формате (DIB) в заданный принимающий прямоугольник. Если целевой прямоугольник является больше, чем исходный прямоугольник, эта функция расширяет ряды и столбцы данных о цвете, чтобы подогнать их под принимающий прямоугольник. Если принимающий прямоугольник является меньше, чем исходный, StretchDIBits сжимает ряды и столбцы при помощи использования заданной растровой операции.

Windows 98/Me, Windows 2000/XP: функция StretchDIBits расширена, чтобы дать возможность изображение  в формате JPEG или PNG передавать как исходное изображение.

Например:

// pvJpgImage указатель на буфер, содержащий изображение JPEG
// nJpgImageSize - размер этого буфера
// ulJpgWidth - ширина изображения JPEG
// ulJpgHeight - высота изображения JPEG
//

//
// Проверим, поддерживается ли CHECKJPEGFORMAT  (устройство имеет
// поддержку JPEG) и используется ли он, проверим как устройство может
// обрабатывать изображения в формате JPEG.
//

ul = CHECKJPEGFORMAT;

if (
    // Проверим, существует ли CHECKJPEGFORMAT:

    (ExtEscape(hdc, QUERYESCSUPPORT,
               sizeof(ul), &ul, 0, 0) > 0) &&

    // Проверим, без ошибок ли исполнен CHECKJPEGFORMAT:

    (ExtEscape(hdc, CHECKJPEGFORMAT,
               pvJpgImage, nJpgImageSize, sizeof(ul), &ul) > 0) &&

    // Проверим код состояния возвращенный CHECKJPEGFORMAT:

    (ul == 1)
   )
{
    //
    // Инициализируем структуру BITMAPINFO.
    //

    memset(&bmi, 0, sizeof(bmi));
    bmi.bmiHeader.biSize        = sizeof(BITMAPINFOHEADER);
    bmi.bmiHeader.biWidth       = ulJpgWidth;
    bmi.bmiHeader.biHeight      = -ulJpgHeight; //изобразим сверху вниз
    bmi.bmiHeader.biPlanes      = 1;
    bmi.bmiHeader.biBitCount    = 0;
    bmi.bmiHeader.biCompression = BI_JPEG;
    bmi.bmiHeader.biSizeImage   = nJpgImageSize;

    //
    // Создадим SetDIBitsToDevice.
    //

    iRet = StretchDIBits(hdc,
                         // целевой прямоугольник
                         ulDstX, ulDstY, ulDstWidth, ulDstHeight,
                         // источниковый прямоугольник
                         0, 0, ulJpgWidth, ulJpgHeight,
                         pvJpgImage,
                         &bmi,
                         DIB_RGB_COLORS,
                         SRCCOPY);

    if (iRet == GDI_ERROR)
        return FALSE;
}
else
{
    //
    // Декомпрессируем изображение в формат DIB и вызовем 
    // функцию StretchDIBits вместо DIB.
    //
}

 

Назад в оглавление темы
На главную страницу темы

Hosted by uCoz