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

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

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

c#のImageクラスとGraphicsクラスの違いについて

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

■83720 / inTopicNo.1)  c#のImageクラスとGraphicsクラスの違いについて
  
□投稿者/ こん (1回)-(2017/04/04(Tue) 16:39:19)

分類:[C#] 

タイトルの通りなのですがImageクラスとGraphicsクラスの違いがいまいち分かりません。
それぞれの役割や実際の使用場面などの違いについて詳しく知りたいです。
例えば200×100のpng画像をファイルから読み込み30°回転して150%に拡大して
PictureBoxを用いてpanel上に表示する一般的な手法などを例に教えていただきたいです。

宜しくお願い致します。
引用返信 編集キー/
■83723 / inTopicNo.2)  Re[1]: c#のImageクラスとGraphicsクラスの違いについて
□投稿者/ 魔界の仮面弁士 (1236回)-(2017/04/04(Tue) 17:10:36)
No83720 (こん さん) に返信
> タイトルの通りなのですがImageクラスとGraphicsクラスの違いがいまいち分かりません。
Image → 画像そのもの(画用紙やキャンバスに相当)
Graphics → 描画ツール(ペンやブラシなどによる描画処理)



> それぞれの役割や実際の使用場面などの違いについて詳しく知りたいです。

たとえば、test.png ファイルを Image.FromFile メソッドで読み込んだ Image オブジェクトに対し、
Graphics.FromImage メソッドで生成した Graphics クラスを使って描画した場合、
実際の描画結果は Image オブジェクトに対して反映されます。

ただし、これだけでは test.png ファイルの内容は変化しません。
ファイルとして保存するには、Image オブジェクトの Save メソッド等を用いる必要があります。


上記では画像ファイルに対する描画処理を例に挙げましたが、
描画対象が画像ファイルであるとは限りません。

たとえば「プリンター」への出力や、「画面上への描画」においても、
Graphics クラスが使われることがあります。

下記の「PictureBoxのImageプロパティに関するよくある勘違い」も参考になるかもしれません。
http://dobon.net/vb/dotnet/graphics/pictureboximageanddrawimage.html



Image は画像データに対する総称型であり、実際のインスタンスとしては
System.Drawing.Image クラスを継承した画像クラスである
 System.Drawing.Bitmap
 System.Drawing.Imaging.Metafile
が用いられます。.jpg/.bmp/.png/.gif/.tif は前者、.wmf/.emf 等は後者です。

この他、.ico などのために System.Drawing.Icon という画像形式や
.cur で使われる System.Windows.Forms.Cursor などの画像形式もありますが、
これらは Image クラスを継承していません。


> 例えば200×100のpng画像をファイルから読み込み30°回転して150%に拡大して

画像ファイルを 30度回転させて描画
http://dobon.net/vb/dotnet/graphics/skewing.html#rotate

画像ファイルを拡大して描画
http://dobon.net/vb/dotnet/graphics/drawimage.html#scaling



> PictureBoxを用いてpanel上に表示する一般的な手法などを例に教えていただきたいです。

「PictureBox上に表示する」でも「panel上に表示する」でもなく、
「PictureBoxを用いてpanel上に表示する」とのことですが、
どういう処理をイメージしているのかわかりませんでした。
引用返信 編集キー/
■83725 / inTopicNo.3)  Re[2]: c#のImageクラスとGraphicsクラスの違いについて
□投稿者/ こん (2回)-(2017/04/04(Tue) 17:32:39)
No83723 (魔界の仮面弁士 さん) に返信

とても分かりやすい解説ありがとうございます。


> 画像ファイルを 30度回転させて描画
> http://dobon.net/vb/dotnet/graphics/skewing.html#rotate

Imageクラスでも画像の読み込みは可能なはずですが、
リンク先の例では画像を読み込む際にbitmapクラスを使用していましたがこれの理由はありますか?
画像ファイルはbitmapクラスを使うのが慣例…というような理由ではなく、
処理速度や機能的な面で理由があれば知りたいです。



>>PictureBoxを用いてpanel上に表示する一般的な手法などを例に教えていただきたいです。

> 「PictureBox上に表示する」でも「panel上に表示する」でもなく、
> 「PictureBoxを用いてpanel上に表示する」とのことですが、
> どういう処理をイメージしているのかわかりませんでした。

すみません。これについては自己完結しました。
引用返信 編集キー/
■83726 / inTopicNo.4)  Re[3]: c#のImageクラスとGraphicsクラスの違いについて
□投稿者/ 魔界の仮面弁士 (1238回)-(2017/04/04(Tue) 17:55:16)
No83725 (こん さん) に返信
> Imageクラスでも画像の読み込みは可能なはずですが、
> リンク先の例では画像を読み込む際にbitmapクラスを使用していましたがこれの理由はありますか?

Image は『抽象クラス』(VB=MustInherit/C#=abstract)です。一方、
Bitmap はそれを継承した派生クラスです。この継承関係は先に述べましたね。

Bitmap クラスには
 Dim canvas As New Bitmap(幅, 高さ)
 Dim img As New Bitmap("dbs1.gif")
などの『コンストラクタ』がありますが、Image は抽象クラスなので、
そもそも Image を New で作成することはできません。


ちなみに、Image クラスにも
 Dim a As Image = Image.FromFile(sFilePath)
 Dim b As Image = Image.FromStream(oStream)
といった共有メソッドでインスタンス化できますが、
これらのメソッドでは、画像データのバイナリに応じて、
最終的には Bitmap クラスもしくは Metafile クラスの
どちらかのインスタンスが返却される仕様です。
引用返信 編集キー/
■83727 / inTopicNo.5)  Re[4]: c#のImageクラスとGraphicsクラスの違いについて
□投稿者/ こん (3回)-(2017/04/04(Tue) 18:13:38)
No83726 (魔界の仮面弁士 さん) に返信

> ちなみに、Image クラスにも
>  Dim a As Image = Image.FromFile(sFilePath)
>  Dim b As Image = Image.FromStream(oStream)
> といった共有メソッドでインスタンス化できますが、
> これらのメソッドでは、画像データのバイナリに応じて、
> 最終的には Bitmap クラスもしくは Metafile クラスの
> どちらかのインスタンスが返却される仕様です。

なるほどそういう仕様だったのですね、すっきりしました。
ありがとうございました。
解決済み
引用返信 編集キー/

このトピックをツリーで一括表示


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

このトピックに書きこむ