Qt对于图片的操作主要集中在这几个类 QImage ,QImageReader ,QPixmap
其中QImage这个类对图片的缩放有几个很不错的技巧,不过对于大图片却并不好使,当我们去看QImage的实现代码时,会发现其中读取QImageReader来加载图片,当我们去看QImageReader的实现的时候,我们会发现QImageReader的加载模式是unbuffer-->无缓冲加载模式,而且加载速度也是相当的快,所以QImageReader对大图片进行缩放很好使.
但是QImage也是有一些独特的优势,在内存数据或者不是超大数据图片时,进行平缓缩放(特别是两步缩放的时候,时间效率和图片质量都还是相当不错的)
下面逐一说明,对于QImage如何进行平滑缩放
1 /*设定图片大小*/ 2 unsigned int image_width ,image_height; 3 4 image_width=1000; 5 image_height=1000; 6 7 QImage m_image("D:\123.jpg"); 8 /* 9 *首先缩放到我们设定大小的四倍,在缩放到我们需要缩放的 10 *大小(时间效果很快,图片质量比较好) 11 *需要结合快速减半法一起使用. 12 */ 13 QImage m_res = m_image.scaled(image_width<<2, 14 image_height<<2).scaled(image_width, image_height,Qt::IgnoreAspectRatio,Qt::SmoothTransformation 15 ); 16 17 QLabel *m_label= new QLabel; 18 m_label->setPixmap(QPixmap::fromImage(m_image)); 19 m_label->show();
对于QImageReader则可以这样设定图片(可以任意比例)
QImage img; QImageReader reader; // 设置图片名 reader.setFileName("D:\123.jpg"); // 读取图片大小 //sleep(30000); QSize imageSize = reader.size(); // 缩放图片尺寸以适应屏幕大小 //imageSize.scale(100,100,); //设定宽度高度比例 //imageSize.scale(100,Qt::KeepAspectRatio); // 设置图片大小 imageSize.setHeight(500); imageSize.setWidth(500); reader.setScaledSize(imageSize); img= reader.read(); // 读取图片 QLabel *m_label= new QLabel; //m_label->resize(image_width,image_height); img.save("D://4567.jpg"); m_label->setPixmap(QPixmap::fromImage(img)); m_label->show();
不过很可惜,对于超大图片而言,Qt只能对于支持的图片进行操作(比如jpeg由于是8*8block的模式,支持一行一行读取,所以可以节省较大的内存空间),而对于其他不支持的格式,当面临较大的尺寸时,会出现因为内存太大,而无法加载的情况...