2011年12月28日水曜日

( Qt C++ )QImageによるサムネイルの作成

最近i3の入ったパソコンを使いました。core2と大して変わらんだろうとナメていましたがこれが本当に速い。これが本当にローエンドか?しかも3Ghz以上が1万円以下!?ゲームやエンコードはしないがウィンドウやアプリをバンバン開く私にとってはとても魅力的です。ハードの進化は早いですねぇ...。

はい、それでは QImageによるサムネイル作成をやっていきます。
このやり方は簡単ですが低速です。画像の枚数が多い場合は他のやり方が必要となります。
(一応次の記事を予定しています。)
サンプルは独自のものを使います。
そして、いつものようにQtCreaterなどでMainWindowなどのGUI部品を定義済みであるとします。(QtCreaterなどの使い方は ”Qtをはじめよう" を見てください。)
ではコードを

(mainwindow.h)
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT//マクロ
   
public:
    explicit MainWindow(QWidget *parent = 0);//コンストラクタ
    ~MainWindow();//デストラクタ

protected:
    void paintEvent(QPaintEvent *);//←ここ重要!ペイントイベント
  
private:
    Ui::MainWindow *ui;//uiにはGUI部品が記述
}; 


(mainwindow.cpp)
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)//uiにはGUI部品に関する記述
{
    ui->setupUi(this);//uiのGUI部品の初期化
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *)//←重要!ペイントイベント
{
     QImage image = QImage("//home//ubuntu001//sampleImage2.png");

    QImage thumbnail = image.scaled(128, 128, Qt::IgnoreAspectRatio, Qt::SmoothTransformation);//サムネイル128×128で良画質で作成

    QPainter widgetPainter(this);//ウィジット用のQPainter
    widgetPainter.drawImage(50, 50, thumbnail);//サムネイル描画
    widgetPainter.drawImage(150, 50, QImage("//home//ubuntu001//sampleImage2.png"));/*比較のため元の大きさの画像も描画*/
}



はい簡単ですね。 理解に重要なのはpaintEventだけですので他は無視してしまっても構いません。
まずimageに画像を読込みます。次にimage.scaledを呼び出しthumbnailにサムネイルを作成します。この場合128×128の良画質になります。なおIgnoreAspectTatioなどの値はリファレンスを参照してください。(リファレンス
この後はウィジット用(この場合MainWindow)のQPainterを定義し、そこにサムネイルと元の大きさの画像を表示しています。

実行すると以下のようになります。


以上です。次回は今回よりも高速な別のサムネイル作成方法です。