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的模式,支持一行一行讀取,所以可以節省較大的內存空間),而對於其他不支持的格式,當面臨較大的尺寸時,會出現因為內存太大,而無法加載的情況...