質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

Q&A

解決済

1回答

954閲覧

Canvasをjpgに変換して保存すると、画像サイズが変わる時がある

starslip0120

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

WPF

Windows Presentation Foundation (WPF) は、魅力的な外観のユーザー エクスペリエンスを持つ Windows クライアント アプリケーションを作成するための次世代プレゼンテーション システムです

0グッド

1クリップ

投稿2017/09/05 11:34

画像に文字を埋め込むために、一度画像をCanvasに描画し、文字をCanvas上で追加したあと、以下のコードでCanvas上に描画したものをjpgファイルに変換して保存しているのですが、保存時にコード内のlabelTextの部分だけがトリミングされる場合があります。
きちんとCanvas全体をjpgにして保存したいのですが、どうしたらいいでしょうか?

//追加する文字を設定 TextBox labelText = new TextBox(); labelText.Text = "画像内に埋め込む文字"; //加工する画像をImageに設定 Image fixImage = new Image(); fixImage.Source = bitmapImage; //画像サイズからキャンバスサイズを調整 tempCanvas.Width = bitmapImage.PixelWidth; tempCanvas.Height = bitmapImage.PixelHeight; //画像をキャンバスに追加 tempCanvas.Children.Add(fixImage); //画像に埋め込む文字をキャンバスに追加 Canvas.SetLeft(labelText, 40); Canvas.SetTop(labelText, 40); tempCanvas.Children.Add(labelText); //キャンバスをUIElementに変換 UIElement panel = tempCanvas as UIElement; //画像の保存先フォルダを指定 StorageFolder keyFolder= ApplicationData.Current.LocalFolder; //保存先ファイル名を指定 StorageFile fixFile = await keyFolder.CreateFileAsync("保存するファイル名" + ".jpg", Windows.Storage.CreationCollisionOption.ReplaceExisting); //画像をjpgに変換 // レンダリングをして画像バッファを取得 RenderTargetBitmap renderTargetBitmap = new RenderTargetBitmap(); await renderTargetBitmap.RenderAsync(panel); var pixelBuffer = await renderTargetBitmap.GetPixelsAsync(); // Encode the image to the selected file on disk using (var fileStream = await fixFile.OpenAsync(FileAccessMode.ReadWrite)) { // JPG形式で保存 var encoder = await BitmapEncoder.CreateAsync(BitmapEncoder.JpegEncoderId, fileStream); encoder.SetPixelData( BitmapPixelFormat.Bgra8, BitmapAlphaMode.Ignore, (uint)renderTargetBitmap.PixelWidth, (uint)renderTargetBitmap.PixelHeight, DisplayInformation.GetForCurrentView().LogicalDpi, DisplayInformation.GetForCurrentView().LogicalDpi, pixelBuffer.ToArray()); await encoder.FlushAsync(); }

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

キャンバスを最新の状態にするUpdateLayout()を使用することで正常に画像を保存することができました。

投稿2017/09/07 00:05

starslip0120

総合スコア28

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問