Как сжать изображение на Linux? - PullRequest
1 голос
/ 11 февраля 2011

Я пишу функцию для сжатия изображения с помощью GDI + в Windows, и она работает хорошо,

void ImageProcessorImpl::compressImpl(const std::string& path, int size, UInt8 quality)
{
    HBITMAP hbmReturn = NULL;
    Bitmap* bmPhoto = NULL;

    std::wstring upath;
    UnicodeConverter::toUTF16(path, upath);

    // make source file close automatically, Bitmap detructor will be called
    { 
        Bitmap image(upath.c_str());

        int srcWidth  = image.GetWidth();
        int srcHeight = image.GetHeight();

        float percent = 0;
        int destX = 0, destY = 0;
        if (srcWidth > srcHeight)
        {
            percent = ((float)size/(float)srcWidth);
            destX   = (int)((size - (srcWidth * percent))/2);
        }
        else
        {
            percent = ((float)size/(float)srcHeight);
            destY   = (int)((size - (srcHeight * percent))/2);
        }

        if (percent >= 1.0f)
            return; // skip compress

        int destWidth  = (int)(srcWidth * percent);
        int destHeight = (int)(srcHeight * percent);

        bmPhoto = new Bitmap(destWidth, destHeight, PixelFormat24bppRGB);
        bmPhoto->SetResolution(image.GetHorizontalResolution(), image.GetVerticalResolution());

        Graphics *grPhoto = Graphics::FromImage(bmPhoto);
        Color colorW(255, 255, 255, 255);
        grPhoto->Clear(colorW);
        grPhoto->SetInterpolationMode(InterpolationModeHighQualityBicubic);
        grPhoto->DrawImage(&image, Rect(destX, destY, destWidth, destHeight));

        bmPhoto->GetHBITMAP(colorW, &hbmReturn);
        delete grPhoto;
    } // end source image file, Bitmap image(upath.c_str());

    // find appropriate encoder, jpeg
    CLSID encoderClsid;
    getEncoderClsid(L"image/jpeg", &encoderClsid);

    // set output quality for jpeg alone
    EncoderParameters encoderParameters;
    setEncoderQuality(&encoderParameters, &quality);

    // output to image file with desired quality
    bmPhoto->Save(upath.c_str(), &encoderClsid, &encoderParameters);

    // release resources
    delete bmPhoto;
    DeleteObject(hbmReturn);
}

int ImageProcessorImpl::getEncoderClsid(const WCHAR* format, void* clsid)
{
    UINT num = 0; // number of image encoders
    UINT size = 0; // size of the image encoder array in bytes

    ImageCodecInfo* pImageCodecInfo = NULL;
    GetImageEncodersSize(&num, &size);
    if(size == 0)
        return -1; // Failure

    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));
    if(pImageCodecInfo == NULL)
        return -1; // Failure

    GetImageEncoders(num, size, pImageCodecInfo);
    for (UINT j = 0; j < num; ++j)
    {
        if (wcscmp(pImageCodecInfo[j].MimeType, format) == 0)
        {
            *(CLSID*)clsid = pImageCodecInfo[j].Clsid;
            free(pImageCodecInfo);
            return j;    //Success
        }
    }

    free(pImageCodecInfo);
    return -1; // Failure
}

void ImageProcessorImpl::setEncoderQuality(void* params, UInt8* quality)
{
    EncoderParameters* encoderParams = (EncoderParameters*)params;
    encoderParams->Count = 1;
    encoderParams->Parameter[0].Guid = EncoderQuality;
    encoderParams->Parameter[0].Type = EncoderParameterValueTypeLong;
    encoderParams->Parameter[0].NumberOfValues = 1;

    encoderParams->Parameter[0].Value = quality;
}

Но, я хочу использовать эту функцию в Linux, я не знаю, какую библиотеку я могу использоватьреализовать такую ​​функцию на Linux, кто может мне помочь?Thnx

Ответы [ 2 ]

2 голосов
/ 11 февраля 2011

Вы можете использовать библиотеку ImageMagick или библиотеку netpbm. Netpbm также имеет инструменты командной строки для управления изображениями.

1 голос
/ 11 февраля 2011

OpenCV предоставляет простой в использовании интерфейс для всех типов обработки изображений, а также простых вещей, таких как сжатие изображений. Это может быть немного излишним только для сжатия изображений, но я полагаю, это может быть полезно, если вы планируете делать с этими изображениями другие вещи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...