WPFとVBでアプリ作る準備その6、Canvas内に表示している複数画像を1枚の画像にして保存
前回は昨日の
続き
Canvas内に表示されている画像を保存
保存ボタンをクリックで
保存ダイアログ表示
空白の部分は透明になるけど写真画像だとファイルサイズが大きくなる
画像保存時に画質劣化は基本的にない
jpg、Jpeg画像形式
半透明や透明ができないので空白部分は黒くなるか指定した色になるけど
写真画像向き、保存時に画質劣化するけど画質(QualityLevel)を指定できる
デザイン画面とXAML
保存ボタンを付け加えた、名前はsaveにした
ExImageクラス
MainWindow
canvas1に表示されている画像を保存するメソッド
SaveAllimage
セーブダイアログ作成
New Microsoft.Win32.SaveFileDialog
141:
これが画像形式(ファイルの種類)を選択するところになる
142:AddExtension=True
ファイル名に自動で拡張子をつける
描画関係、この辺はよくわかっていない
ExImage(画像)を表示してあるcanvas1自体を使ってVisualBrushを作成してそのブラシを使ってDrawingContextの四角形に塗っている?のが154行目
そのあと、158行目でRenderTargetBitmapを作成して
159行目でそこにまた塗っている?
なんか冗長な感じがするw
でもこれでBitmapができたっぽい
エンコーダ選択して作成
さっきのファイルの種類の設定で指定したFilterは順番に1から始まるインデックスが付けられているのでそのインデックスからそれぞれの形式のエンコーダを作成
2番のJpegだけは画質設定ができたので97に指定してみた
エンコーダにBitmapを渡して保存
159行目でできあがったBitmapを使ってBitmapFrameを作って
エンコーダのFramesに追加
ファイルストリームを使ってエンコーダのSaveメソッドで保存
やっとできた
Dim vb As New VisualBrush(canvas1)
っていうこれだけでcanvas1のブラシが作れるのはスゴイ便利な気がする
試しにこのcanvas1部分をGridのgrid1に変更して
Dim vb As New VisualBrush(grid1)
この状態で保存した画像が
これ↓
サイズが違うけどしっかりgrid1にあるものが描画されている
148 Dim canvasRect As Rect = GetUnion(CollectionExImage)
149 canvasRect = New Rect(grid1.RenderSize)
こうして保存したら
こうなったw
画像自体は簡単に取得できる
こうなる
WPFの自動透過処理は素晴らしい
予定しているテスト
- ドラッグ移動時に指定ピクセル数ごとに移動
- 指定した画像の表示を消す(削除)
- 指定した色を透明にする
- レイアウト
完了したテスト
- 画像ファイルドロップで画像表示
- 画像をマウスドラッグで移動
- 表示画像のレイヤー間の移動(入れ替え)ZOrder指定
- 表示画像すべてを画像ファイルとして保存←New
参照したところは
キャンバスに描いた絵を画像ファイルとして保存する | HIRO's.NET Blog
http://blog.hiros-dot.net/?page_id=3802
Daizen Ikehara : [WPF] XamQRCodeBarcode を画像として保存 [Tips]
http://blogs.jp.infragistics.com/blogs/dikehara/archive/2014/02/12/wpf-xamqrcodebarcode-tips.aspx
RenderTargetBitmap tips - Jaime Rodriguez - Site Home - MSDN Blogs
http://blogs.msdn.com/b/jaimer/archive/2009/07/03/rendertargetbitmap-tips.aspx
今回の記事の続き
WPFとVBでアプリ作る準備その7、指定した間隔ごとにコントロールをマウスドラッグ移動 ( ソフトウェア ) - 午後わてんのブログ - Yahoo!ブログ
http://blogs.yahoo.co.jp/gogowaten/13924059.html