プログラムの事とか

お約束ですが「掲載内容は私個人の見解です」

WPFでアプリ画面をキャプチャーしてJpegで保存する(exif付き)

なにでググったらよかったのか分からなかったので自分で書きます(主にexifのところが)

ソース

github.com

とりあえず動くものを置きました。自由に使ってください

以下はその説明みたいな感じ

UIElementを画像にする

WPFなのでSystem.Drawingは使いません(たまに使うけど)

var width = (int)CaptureTarget.ActualWidth;
var height = (int)CaptureTarget.ActualHeight;

// UIElement to RenderTargetBitmap
var renderTargetBitmap = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Pbgra32);
var visual = new DrawingVisual();
using (var context = visual.RenderOpen())
{
    var brush = new VisualBrush(CaptureTarget);
    context.DrawRectangle(brush, null, new Rect(0, 0, width, height));
}
renderTargetBitmap.Render(visual);

RenderTargetBitmapDrawingVisualでうまいこと作りましょう

exifを付ける

BitmapMetadataってのを作ってその中にいろいろ入れちゃいます

var encoder = new JpegBitmapEncoder();

// Add exif data
var metadata = new BitmapMetadata("jpg");
metadata.ApplicationName = Assembly.GetExecutingAssembly().GetName().Name;
metadata.Comment = Assembly.GetExecutingAssembly().GetName().Version.ToString();
metadata.DateTaken = DateTime.UtcNow.ToString(DateTimeFormatInfo.InvariantInfo);
//Custom metadata
//metadata.SetQuery("", "");

encoder.Frames.Add(BitmapFrame.Create(renderTargetBitmap, null, metadata, null));

一般的なのはプロパティとしてすでに生えているのでそこに代入

今回はアプリ名・コメント(バージョン)・作成日時を入れてみました

プロパティが無い奴はSetQueryメソッドで追加できるっぽいです

あとは保存して完成

f:id:puni-o:20171215112818j:plain

できました