#include <QApplication>
#include <QDebug>
#include <QImage>
#include <QPixmap>
#include <QFile>
#include <QBuffer>
#include <QElapsedTimer>
/*!
* \brief compressImage
* \param srcImg 源图像文件
* \param imgSize 压缩指定的图像尺寸 如果需要保持原尺寸不变则传入srcImg.size()
* \param fileSize 压缩指定的文件大小
* \return
*/
QImage compressImage(const QImage &srcImg,QSize imgSize = QSize(1024,768),int fileSize = 180*1024)
{
QPixmap pixmap;
pixmap = pixmap.fromImage(srcImg.scaled(imgSize,Qt::IgnoreAspectRatio,Qt::FastTransformation));
QBuffer buff;
int quality = 100;
pixmap.save(&buff, "jpeg",quality);
QImage outImage = QImage::fromData(buff.buffer());
//根据文件大小
qint64 fsz = buff.size();
while (fsz > fileSize)
{
quality = quality - 2;
if (quality <= 0) break;
QBuffer tempBuff;
bool isOk = pixmap.save(&tempBuff, "jpeg",quality);
if(isOk){
outImage = QImage::fromData(tempBuff.buffer());
}
fsz = tempBuff.size();
}
return outImage;
}
int main( int argc, char *argv[] )
{
QApplication app( argc, argv );
QString inImg = "image_in.jpg";
QString outImg = "image_out.jpg";
if(QFile::exists(inImg)){
QElapsedTimer elpTime;
elpTime.start();
QImage img = compressImage(QImage(inImg));
bool isOk = img.save(outImg);
qDebug("save new file to %s %s,elapsedTime:%lld ms",
outImg.toLocal8Bit().data(),
isOk?"success":"fail",
elpTime.elapsed());
} else {
qWarning("%s:file does not exist",inImg.toLocal8Bit().data());
}
return app.exec();
}
Qt 图片压缩 指定文件大小和尺寸
最新推荐文章于 2024-06-03 11:25:31 发布