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");
}