gpt4 book ai didi

c++ - 如何在 Linux 上压缩图像?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:58 24 4
gpt4 key购买 nike

我正在编写在 Windows 上使用 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;
}

但是,我想在linux上有这个功能,我不知道我可以用什么lib在linux上实现这个功能,谁能帮帮我?谢谢

最佳答案

您可以使用 ImageMagick 库或 netpbm 库。 Netpbm 也有命令行工具来操作图像。

关于c++ - 如何在 Linux 上压缩图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4966927/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com