C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[8]: WPF での画像の拡大


(過去ログ 86 を表示中)

[トピック内 9 記事 (1 - 9 表示)]  << 0 >>

■51404 / inTopicNo.1)  WPF での画像の拡大
  
□投稿者/ 雲 (7回)-(2010/07/04(Sun) 20:02:04)

分類:[C#] 

WindowsForm では、Graphics.DrawImage を使うことで簡単に画像の拡大が出来ていたのですが、WPF で同じことをやろうと
思ってドツボにはまってしまいました。

調べた範囲では、

座標を変換して拡大させる
http://stackoverflow.com/questions/741956/wpf-pan-zoom-image

というのは見つけたのですが、WindowsFormの時のように拡大させる方法も調べたいと思って調べました。

結局、(WindowsFormと同様に)DrawingContext を使って画像を表示する方法があることはわかったのですが
この関数には、拡大をさせるパラメータが見あたりません。

まさか、WPF で画像の拡大方法が(座標変換以外)無い。ということは無い、と思っているのですがちょっと
調べ切れていません。

何か、ヒントでも頂ければとても嬉しいです。よろしくお願いします。
引用返信 編集キー/
■51405 / inTopicNo.2)  Re[1]: WPF での画像の拡大
□投稿者/ Hongliang (661回)-(2010/07/04(Sun) 20:14:52)
んー、例えば Image に表示させるなら、Image の Width/Height を変更するだけで十分ですが(Stretch が None 以外のとき)。
元画像の N 倍とかなら Width/Height に IValueConverter を使ったバインディングでいいですし。

なんのために拡縮するのかが分からないことには何とも。
引用返信 編集キー/
■51406 / inTopicNo.3)  Re[2]: WPF での画像の拡大
□投稿者/ 雲 (8回)-(2010/07/04(Sun) 20:42:55)
No51405 (Hongliang さん) に返信
> んー、例えば Image に表示させるなら、Image の Width/Height を変更するだけで十分ですが(Stretch が None 以外のとき)。

その場合って、Image のコントロールのサイズも一緒に大きくなる方法しか思いつきませんでした。
人のサンプルですが、これで zoom ボタンを押した時と同じです(やり方が悪い可能性が高いですが。。。)

http://homepage.mac.com/mikaduki27/nankatukuru/Silverlight10/part4/SampleHTMLPage.html

> 元画像の N 倍とかなら Width/Height に IValueConverter を使ったバインディングでいいですし。

はい。ここはこれで行けると思います。

> なんのために拡縮するのかが分からないことには何とも。

あ、ごめんなさい。画像のビューア(拡大ができるもの)をWPFで作りたいのです。
(特に、これといった用途があるわけではないのですが、将来は Paint.Net のようなものを作れると良いな(←結構、無謀)
という感じです)


引用返信 編集キー/
■51411 / inTopicNo.4)  Re[3]: WPF での画像の拡大
□投稿者/ Hongliang (663回)-(2010/07/05(Mon) 00:21:45)
> その場合って、Image のコントロールのサイズも一緒に大きくなる方法しか思いつきませんでした。
> 人のサンプルですが、これで zoom ボタンを押した時と同じです(やり方が悪い可能性が高いですが。。。)
> http://homepage.mac.com/mikaduki27/nankatukuru/Silverlight10/part4/SampleHTMLPage.html
ビューアにおいてそれが問題になることは無さそうに思えますが、どんな問題を考慮されているのでしょうか?

最終的にファイル等に出力する必要がある場合、TransformedBitmap 辺りをチェーンさせることになるとは思います。
引用返信 編集キー/
■51413 / inTopicNo.5)  Re[4]: WPF での画像の拡大
□投稿者/ 雲 (9回)-(2010/07/05(Mon) 03:45:38)
No51411 (Hongliang さん) に返信
> ビューアにおいてそれが問題になることは無さそうに思えますが、どんな問題を考慮されているのでしょうか?

個人的には、ImageのWidthとHeightが大きくなっても良いのですが、表示領域は変わって欲しくない(スクロールバーで対応したい)。
ということになると思います。

もう一つあるとすると、拡大ロジックの指定方法ですね。WindowsForm(やGDI) だと、画像の拡大方法はニアレストネイバーとかいろいろと
指定が出来るのですが、現状の座標変換での拡大方法についてはその指定方法が(探した範囲では)見つけられない。です。

> 最終的にファイル等に出力する必要がある場合、TransformedBitmap 辺りをチェーンさせることになるとは思います。

そうですね。最終的には拡大した結果をファイルに出力することまで実装する必要はあります(が、すっかり忘れていました)ので、
その方法も考えないといけないです。



引用返信 編集キー/
■51415 / inTopicNo.6)  Re[5]: WPF での画像の拡大
□投稿者/ Hongliang (664回)-(2010/07/05(Mon) 09:39:51)
> 個人的には、ImageのWidthとHeightが大きくなっても良いのですが、表示領域は変わって欲しくない(スクロールバーで対応したい)。
それはむしろ Image のサイズが変わるべき要件では?
親の ScrollViewer のサイズを固定にするってだけでしょう。そのとき Image のサイズが変わらなければスクロールさせられません。

> もう一つあるとすると、拡大ロジックの指定方法ですね。WindowsForm(やGDI) だと、画像の拡大方法はニアレストネイバーとかいろいろと
> 指定が出来るのですが、現状の座標変換での拡大方法についてはその指定方法が(探した範囲では)見つけられない。です。
座標変換でも Width/Height でも、Image に RenderOptions.BitmapScalingMode 添付プロパティを設定することでスケーリングアルゴリズムを指定できます。
// TransformedBitmap に適用する方法についてはちょっと分かりませんが。
引用返信 編集キー/
■51439 / inTopicNo.7)  Re[6]: WPF での画像の拡大
□投稿者/ 雲 (10回)-(2010/07/06(Tue) 05:23:29)
No51415 (Hongliang さん) に返信
> それはむしろ Image のサイズが変わるべき要件では?
> 親の ScrollViewer のサイズを固定にするってだけでしょう。そのとき Image のサイズが変わらなければスクロールさせられません。

ううむ。なるほど。とりあえず、ScrollViewerを使ってスクロールバーを出すところまではできました。が、画像を拡大してもスクロールの範囲が
変わらない。。。ActualWidth は readonly みたいだし。。。と悩んでいます。

>>もう一つあるとすると、拡大ロジックの指定方法ですね。WindowsForm(やGDI) だと、画像の拡大方法はニアレストネイバーとかいろいろと
>>指定が出来るのですが、現状の座標変換での拡大方法についてはその指定方法が(探した範囲では)見つけられない。です。
> 座標変換でも Width/Height でも、Image に RenderOptions.BitmapScalingMode 添付プロパティを設定することでスケーリングアルゴリズムを指定できます。
> // TransformedBitmap に適用する方法についてはちょっと分かりませんが。

ここも、拡大方法はBitmapScalingModeを使うことで指定できました。どこかの Q&A でWPFにはそういうプロパティはない。と書いてあったのを
鵜呑みにしていました。

今は、WriteableBitmap に対して、TransformGroup を使って拡大処理をしています。
引用返信 編集キー/
■51445 / inTopicNo.8)  Re[7]: WPF での画像の拡大
□投稿者/ Hongliang (665回)-(2010/07/06(Tue) 12:41:56)
> ううむ。なるほど。とりあえず、ScrollViewerを使ってスクロールバーを出すところまではできました。が、画像を拡大してもスクロールの範囲が
> 変わらない。。。ActualWidth は readonly みたいだし。。。と悩んでいます。
もし RenderTransform に ScaleTransform を適用することで拡大しているのなら当然ですが。レンダリングの際のみ拡大するわけですから、親要素が子要素をレイアウトするときの考慮の対象外です。Width/Height を直接操作するか、LayoutTransform を使うかしないといけません。

> ここも、拡大方法はBitmapScalingModeを使うことで指定できました。どこかの Q&A でWPFにはそういうプロパティはない。と書いてあったのを
> 鵜呑みにしていました。
ちなみに、NearestNeighbor は .NET 3.0 SP1 で追加されたメンバです。それまではスケーリングに最近傍補完を使う方法は(WriteableBitmap 使って自前で各ピクセルごとに拡大するようなのを除けば)ありませんでした。
引用返信 編集キー/
■51451 / inTopicNo.9)  Re[8]: WPF での画像の拡大
□投稿者/ 雲 (11回)-(2010/07/06(Tue) 18:37:33)
No51445 (Hongliang さん) に返信
> もし RenderTransform に ScaleTransform を適用することで拡大しているのなら当然ですが。レンダリングの際のみ拡大するわけですから、親要素が子要素をレイアウトするときの考慮の対象外です。Width/Height を直接操作するか、LayoutTransform を使うかしないといけません。

これ。WindowsForm の時の経験から必要なことだとは思っていたのですが、image.Width をすると値が入っていない(NaN)だったのでやらなくても良いのかと
勝手に思っていました(image の Width と Height を Auto にしたのが原因?)。

>>ここも、拡大方法はBitmapScalingModeを使うことで指定できました。どこかの Q&A でWPFにはそういうプロパティはない。と書いてあったのを
>>鵜呑みにしていました。
> ちなみに、NearestNeighbor は .NET 3.0 SP1 で追加されたメンバです。それまではスケーリングに最近傍補完を使う方法は(WriteableBitmap 使って自前で各ピクセルごとに拡大するようなのを除けば)ありませんでした。

了解です。最初は無かった理由は、想像もつきませんが。。。

ご想像通り、拡大をRenderTransformにScaleTransform 適用したのですが、結構、コード量も少ないし処理も(Core2Quad)高速でびっくりしました。
WindowsForm の時の苦労は何だったのか?と言いたい。

ちょっと、WPF で遊んでみようという気になってきました。

ありがとうございました。

-----------------------------------------------------------
参考:こんな感じで拡大を指定しています。
-----------------------------------------------------------

TransformGroup group = new TransformGroup();

group.Children.Add( new ScaleTransform() );
group.Children.Add( new TranslateTransform()) ;

// 拡大縮小
ScaleTransform scale = (ScaleTransform)group.Children[0];
scale.ScaleX = 1.0;
scale.ScaleY = 1.0;

// 平行移動
TranslateTransform translate = (TranslateTransform)group.Children[1];
translate.X = 0;
translate.Y = 0;

image.RenderTransform = group;
/////////////////////////////////////////////////////////////

// 拡大方法をニアレストネイバーに設定
RenderOptions.SetBitmapScalingMode( image, BitmapScalingMode.NearestNeighbor );

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -