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

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

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

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

Q&A

0回答

836閲覧

Canvasを表示せずにCanvas全体を画像として生成したい

Y...M

総合スコア18

WPF

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

0グッド

0クリップ

投稿2020/03/26 05:23

編集2020/03/27 01:52

前提・実現したいこと

Canvas毎のデータ(位置やサイズ、色の情報を持つクラスのリスト)を読込み、
図形をCanvasに表示するようなツールを検討しています。

複数のデータを持つときに、Canvasにまだ表示していない状態で、
Canvasで表示したときと同じ画像を生成する方法はありますでしょうか。
ご教示お願いいたします。

追記 ※過去の追記は一度削除させていただきました。

目的:スライド一覧(画像一覧)と編集スライド(エディタ)を表示させたい

編集スライドはItemsControl(Canvas)でModelのデータとバインドして表示することができました。
データが既に存在していて、まだ編集スライドとして開いていないものを画像化させるための方法が分からず、当初の質問に至りました。

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

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

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

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

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

hihijiji

2020/03/26 06:33

Canvasで表示したときの画像を生成する方法を書いてください。
Y...M

2020/03/26 07:07

すみません。まだ画像化させるところまでは実装できておりませんが、補足を追記しました。 よろしくお願いします。
hihijiji

2020/03/26 07:08

そこまで出来てるなら、UserControlでもなんでもいいから配置して、 UserControlのインスタンスを作ってCanvasを取得すればいいのでは?
Y...M

2020/03/26 07:31

Xamlに配置せずに、、、と考えていましたが、 UserControlのインスタンスをコードビハインドで作って、 ItemsSourceを与えれば同じものがCanvasに作られるのですね。 MeasureとArrangeを実行すればCanvas内には表示されるのと 同じものが作られている認識であっていますか? ちなみに、少し脱線してしまいますが、MVVMで考えた場合でも 本件のようなCanvasの表示を画像化させる実装は コードビハインド(View)で行うこともでしょうか。
hihijiji

2020/03/26 08:57

> UserControlのインスタンスをコードビハインドで作って 何故コードビハインド? 単純にUserControlのインスタンスをnewで作ったら中身が配置されませんか? やったことないので想像ですが… コードビハインドはコントロールに依存性プロパティを生やす時ぐらいしかつかいませんねぇ
TN8001

2020/03/26 09:27

> Canvasを表示せずに > Canvasにまだ表示していない は全然違いますよね。 Canvasを見せたくないだけなら、何かの背後に回すなりWindow範囲外にずらしたりでいいですが、 Canvasに入っていないものを描画(保存)するとなると、Canvasと同等のものを実装するってことでしょうか? ならCanvasでいいんでは?と思ってしまいますが、大量にアイテムがあったり等何か問題が出ているのでしょうか。
hihijiji

2020/03/26 09:56

題意に至ったまでのシナリオと言うか、本当の目的を書いてくれたらもっといい案が出てきそうですね。 言っちゃなんですが、「Canvasを表示せずにCanvas全体を画像として生成したい」ってだけで手段が根本的に間違っている印象を受けてしまいます。
Y...M

2020/03/27 01:59

TN8001さん、hihijijiさん >題意に至ったまでのシナリオと言うか、本当の目的を書いてくれたらもっといい案が出てきそうですね。 追記しました。再度確認いただけないでしょうか。
Zuishin

2020/03/27 02:02

スライドが何なのかよくわからないけど、要するに大きい画像を一つとサムネイルを複数表示して、サムネイルは選択することで大きい画像として開くことができ、大きい画像は Canvas で実装し、ユーザーによる編集を受け付ける。質問はサムネイルをどういう形で保持すればいいのか。ということなんでしょうか?
Zuishin

2020/03/27 02:03

そうだとしたら、Canvas をたくさん並べればいいだけでは?
hihijiji

2020/03/27 03:18 編集

スライド一覧が、いわゆるサムネイル表示の事なら、 サムネイル表示の為の縮小画像は本体を保存する時に一緒に作成するのがスマートです。 一々生成したらそこそこ重い処理のうえ数が多いので起動後暫く表示されません。 そんなの使い勝手が悪いでしょ?
Y...M

2020/03/27 04:31

>Zuishinさん 回答ありがとうございます。 やりたいことは概ねおっしゃる通りです。 画像表示と固執しておりましたので、Canvasを並べることも一度試してみます。 性能的には、画像生成→表示とCanvasに表示することはそこまで大きく変わらないでしょうか。 Canvasは大量のデータを配置すると遅かったため、画像生成→表示する方法と考えていました。(実際に遅いかを試してはいませんが…。)
Y...M

2020/03/27 04:33

>hihijijiさん 回答ありがとうございます。 おっしゃる通り、本体と同時に生成することが一般的な操作になると想定しています。 ただし、特定なケースで「サムネイルは作られていないが、本体のデータがある」という状況のケースを想像しておりました。
Zuishin

2020/03/27 04:44

重ければキャッシュするのが常套手段なので、一度動くものを作ってからリファクタリングと思っていたんですが、すでに試していて重いのがわかっているなら、表示用のサムネイル画像を別に作ってキャッシュするのがいいと思います。 作るタイミングは、サムネイルとして表示される時でどうでしょうか。 プロパティの作り方で、はじめて get が呼ばれる時に初期化するという方法がありますが、それと同じ要領です。編集された時点でサムネイルを null にし、サムネイルプロパティが読みだされた時に null ならば画像を作ってフィールドに保存し、そうでなければフィールドを返すようにします。
hihijiji

2020/03/27 05:18

「サムネイルは作られていないが、本体のデータがある」 その場合は固定画像じゃダメなの?
Y...M

2020/03/27 05:25

>hihijijiさん その場合の固定画像を作る方法が分からず、本体のデータ(スライドの背景色やCanvasに描かれる図形の情報)からCanvasと同じような見た目の固定画像を作る方法をご教示いただけないでしょうか。
hihijiji

2020/03/27 05:39

固定画像ってのは本体によらず固定の画像って意味です。
hihijiji

2020/03/28 01:52

作っている物はベクターグラフィックスのエディタですよね。 だとしたら編集物のロードにそれなりに時間がかかるはずです。 ユーザはその時間には仕事ができません。 一方、サムネイルは無くても仕事が出来るように設計すべき物なので、 あると便利ですが無くても仕事ができます。 ロード時間の短縮は顧客満足度に直結するので、ロード時には極力 処理を減らすべきです。
Zuishin

2020/03/28 06:01

で、結局サムネイルなんですよね? Canvas によるサムネイル化は可能で、それが重いので軽量化するためにビットマップ化したいと。つまり Canvas をビットマップ化する方法さえわかれば解決ということでいいですか? https://qiita.com/tricogimmick/items/894914f6bbe224a45d49 Canvas を作らずにというのは、Canvas と同機能のものを自分で作らなければならないので、非現実的です。Canvas を作りましょう。この場合は View 層のライブラリ作成に当たるので、MVVM の出番はありません。ガリガリコードを書いてください。
Zuishin

2020/03/28 06:18

それで実際にビットマップ化するコードを使うには、Behavior を作るなりコードビハインドを使うなり好きにすればいいと思いますが、それはまた別の話ですね。
Y...M

2020/03/31 00:37

hihijijiさん >ロード時間の短縮は顧客満足度に直結するので、ロード時には極力 処理を減らすべきです。 上記を念頭に置いて、初期動作(Load)時の仕様を検討してみます。 ありがとうございました。
Y...M

2020/03/31 00:39

Zuishinさん >Canvas を作らずにというのは、Canvas と同機能のものを自分で作らなければならないので、非現実的です。 Canvasを使用して、ViewにはCanvasそのものは表示せずに、生成したBitmapを表示するということですね。 一度実装してみることにします。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問