2011-02-11 3 views
1

나는 창에 GDI +를 사용하여 이미지를 압축하는 기능을 쓰고, 그것이 잘 작동하고,리눅스에서 이미지를 압축하는 방법?

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; 
} 

는하지만, 나는 그런를 구현하는 데 사용할 수있는 lib에는 내가 무엇을 모르는, 리눅스에서이 기능을 갖고 싶어 리눅스에서 함수, 나를 도울 수 있습니까? Thnx

답변

2

ImageMagick 라이브러리 또는 netpbm 라이브러리를 사용할 수 있습니다. Netpbm에는 또한 이미지를 조작하는 명령 행 도구가 있습니다.

+0

어쩌면 netpbm이 다른 웹 사이트에서 이미지 처리에 사용 되었기 때문에 나에게 좋은 선택 일 수 있습니다. 마찬가지로, 모든 종류의 업로드 된 이미지를 압축하기 위해 경량 및 고성능 lib가 필요합니다. 기본적으로 브라우징 중에 다운로드 된이 이미지의 속도를 높이기 위해 압축하고 압축합니다. 나는 그것을 시도 할 것이다, 감사합니다 – tiplip

1

OpenCV은 이미지 압축과 같은 간단한 작업뿐만 아니라 모든 유형의 이미지 처리에 사용하기 쉬운 인터페이스를 제공합니다. 이미지 압축에만 약간의 과잉 사용이 될 수 있지만 이러한 이미지를 사용하여 다른 작업을 수행 할 계획이라면 도움이 될 수 있습니다.

관련 문제