Qt/Gcc


4.画像の処理用配列への取り込み(二次元)
 画像処理を実行するため、配列を動的に確保して、QImageからコピーします。

 4-2 画像のセーブ
 4-1で作成したプログラムに画像のセーブ機能をつけます。

 4-2-1 mainwindow.hの追加
 処理した画像のセーブ用メニューとセーブ用の処理を記載したスロット関数を準備します。
 
 はじめに以下のようにQAction変数を追加します。

  QAction *saveAsAct;//画像のセーブ用メニュー

 このアクションに対するslot関数を定義します。
 public slots://slotsの実装の下に以下のslot関数をメンバー関数として宣言します。

 public slots://slots
   void saveAs();//saveAsを選んだときのスロット関数

 4-2-2 MainWindows.cppの処理
 メニューに「saveAs」のメニューアイテムを追加します。
 このために上記で追加したアクションをメンバー関数であるcreateMenus()内で追加処理を実施して、createAction()内で  createActions()内でsaveAsに対してシグナルとスロットを定義します。
 
 以下、createActions()に追加します。
 saveAsAct = new QAction(tr("&saveAs"),this);//メニューバーにsaveAsを追加する。
 connect(saveAs,SIGNAL(triggered()),this,SLOT(saveAs()));

 createMenu()内で、FileメニューにsaveAsを登録します。

 fileMenu->addAction(saveAsAct);//FileメニューにsaveAsメニューを登録する。

 つきにslot関数の実装です。slot関数はメンバー関数であるsaveAs()でファイルのセーブを実行するようにします。
今回はファイル名のサヒックス(拡張子)で、ファイル形式を区別します。
したがって、セーブの際は必ず拡張子を記載してください。
 saveAs()関数内で、ファイルダイアログを定義します。

      QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),"/home/untitled.jpg",tr("Images (*.bmp *.xpm *.jpg)"));

  このとき、getSaveFielName()は、第3引数である「/home/untitled.jpg」の部分に、とりあえずファイル名まで指定しておく必要があります。さもないと、ファイル名がないと言われて実行時にエラーになります。
  しかし、このようにしても実行時にワーニングが表示されます。これは、まだなぜかわかりません。

「(ImageView:2852): Gtk-WARNING **: Unable to retrieve the file info for `file:///media/sf_Public/mand.jpg': '/media/sf_Public/mand.jpg' というファイルの状態を取得する際にエラー: そのようなファイルやディレクトリはありません」

  QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"), "/home/untitled.jpg", tr("Images (*.bmp *.xpm *.jpg)"));

 ファイル名が正常に取得された場合は、ファイルのセーブを実施します。

  if(!fileName.isEmpty())

 QImageクラスのsave()を使って、画像をファイルにセーブします。
 ここで、save()の第2引数を0にすると、ファイル名の拡張子によって、セーブするフォーマットを自動で識別します。
 第3引数は、圧縮率のようです。ここではデフォルトにします。ただし、デフォルトの圧縮率がどのくらいかわかってないのですが。。。
 if(!inImage.save(fileName,0,-1))

 以下にsaveAs()関数を表示します。

void MainWindow::saveAs()
{
    //QString name = QFileDialog::getSaveFileName(".", "Images (*.bmp)",this, "SaveAs");
    QString fileName = QFileDialog::getSaveFileName(this, tr("Save File"),
                               "/home/untitled.jpg",
                               tr("Images (*.bmp *.xpm *.jpg)"));
  if(!fileName.isEmpty())
    {
        //save function
        // If format is 0, QImage will attempt to guess the format by looking at fileName's suffix.
        // The quality factor must be in the range 0 to 100 or -1. Specify 0 to obtain small compressed files, 100 for large uncompressed files, and -1 (the default) to use the default settings.
        if(!inImage.save(fileName,0,-1))
        {
            QMessageBox::warning(0,"can't save","fail!!");
        }
    }
    else
        QMessageBox::warning(0,"can't open save file","can't open save file");
}

ソースコード

トップページに戻る