• 追加された行はこの色です。
  • 削除された行はこの色です。
#title(.NETプログラミング研究 第2号)

#contents

*.NETプログラミング研究 第2号 [#gb86b0fb]

**ご挨拶 [#h0585a96]

前回の「.NETプログラミング研究 創刊号」は私が生まれて始めて作成したメールマガジンでした。失敗しなかったかと不安でいっぱいでしたが、幸い苦情はなく、大成功とは行かないまでも、無難にはできたかなと胸をなでおろしています。

さて今回から試しにVB.NETだけでなくC#でのサンプルコードも載せることにしました。果たしてこの方がいいか、あるいはどちらかのコードだけで十分かご意見がありましたらお聞かせください。

**.NET Tips [#x6b60c87]

***画像を拡大、縮小して表示する [#xb388a1f]

#column(注意){{
この記事の最新版は「[[画像を拡大、縮小して表示する>http://dobon.net/vb/dotnet/graphics/scaling.html]]」、「[[補間方法を指定して画像を拡大、縮小表示する>http://dobon.net/vb/dotnet/graphics/interpolationmode.html]]」、「[[サムネールイメージの作成>http://dobon.net/vb/dotnet/graphics/thumbnail.html]]」で公開しています。
}}

画像を拡大、縮小して表示する方法(スケーリング)を紹介します。Graphicsクラス(System.Drawing名前空間)のDrawImageメソッドで表示するサイズを指定することにより、簡単にできます。次の例ではもとの画像("C:\サンプル.jpg")を1.5倍に拡大してPictureBox1に表示しています。ここではGraphics.DrawImage(Image, Single, Single, Single, Single)を使いましたが、他のDrawImageのオーバーロードを使用する方法も考えられます。

#code(vbnet){{
'画像を拡大、縮小して表示する(スケーリング)
'Bitmapオブジェクトの作成
Dim image = New Bitmap("C:\サンプル.jpg")
'PictureBox1のGraphicsオブジェクトの作成
Dim g As Graphics = PictureBox1.CreateGraphics()
'元の画像の大きさを1.5倍にして表示する
Dim rect As New RectangleF(0, 0, 1.5F * image.Width, _
                            1.5F * image.Height)
g.DrawImage(image, rect)
}}

#code(csharp){{
//画像を拡大、縮小して表示する(スケーリング)
//Bitmapオブジェクトの作成
Bitmap image = new Bitmap(@"C:\サンプル.jpg");
//PictureBox1のGraphicsオブジェクトの作成
Graphics g  = PictureBox1.CreateGraphics();
//元の画像の大きさを1.5倍にして表示する
RectangleF rect = new RectangleF(0, 0, 1.5F * image.Width, 
                                    1.5F * image.Height);
g.DrawImage(image, rect);
}}

さらにGraphics.InterpolationModeプロパティにより、画像を拡大、縮小表示する時の補間方法を変更することができます。このInterpolationMode列挙体のメンバにはBicubic(双三次補間)、Bilinear(双一次補間)、Default(既定のモード)、High(高品質補間)、HighQualityBicubic(高品質双三次補間)、HighQualityBilinear(高品質双一次補間)、Invalid(QualityMode列挙体の要素Invalidと等価)、Low(低品質補間)、NearestNeighbor(最近傍補間)があります。当たり前のことですが、一般的に高品質の補間方法を指定したときのほうが表示に時間がかかります。

「[[アスキーデジタル用語辞典>http://yougo.ascii24.com]]」によると、「ニアレストネイバー法はその名の通り、単純に元の画像を水増し(拡大)、間引き(縮小)する方式。ジャギーが目立ちやすく階調のある画像のリサイズにはむいていない。バイリニア法、バイキュービック法は元の画像の周辺の複数の画像を数学的に算出して拡大、縮小する。バイキュービック法のほうが計算が複雑で精度が高く階調のある画像のリサイズにむいている。」とのことです。

-[[アスキーデジタル用語辞典 - 補間>http://yougo.ascii24.com/gh/68/006843.html]]
-[[アスキーデジタル用語辞典 - バイキュービック法>http://yougo.ascii24.com/gh/65/006570.html]]

#code(vbnet){{
'補間方法を指定して画像を縮小して表示する
'Bitmapオブジェクトの作成
Dim image = New Bitmap("C:\サンプル.jpg")
'PictureBox1のGraphicsオブジェクトの作成
Dim g As Graphics = PictureBox1.CreateGraphics()
'補間方法として最近傍補間を指定する
g.InterpolationMode = _
    System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor
'画像を縮小表示
g.DrawImage(image, 0, 0, 150, 120)
'補間方法として高品質双三次補間を指定する
g.InterpolationMode = _
    System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
'画像を縮小表示
g.DrawImage(image, 160, 0, 150, 120)
}}

#code(csharp){{
//補間方法を指定して画像を縮小して表示する
//Bitmapオブジェクトの作成
Bitmap image = new Bitmap(@"C:\サンプル.jpg");
//PictureBox1のGraphicsオブジェクトの作成
Graphics g = PictureBox1.CreateGraphics();
//補間方法として最近傍補間を指定する
g.InterpolationMode = 
    System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
//画像を縮小表示
g.DrawImage(image, 0, 0, 150, 120);
//補間方法として高品質双三次補間を指定する
g.InterpolationMode = 
    System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
//画像を縮小表示
g.DrawImage(image, 160, 0, 150, 120);
}}

最後にサムネールイメージ(縮小イメージ)の作成方法を紹介します。サムネールイメージを作成するにはImage.GetThumbnailImageメソッド使用します。

#code(vbnet){{
'サムネールイメージを作成
'Bitmapオブジェクトの作成
Dim myBitmap = New Bitmap("C:\納屋.jpg")
'PictureBox1のGraphicsオブジェクトの作成
Dim g As Graphics = PictureBox1.CreateGraphics()
'サムネールイメージを作成大きさを100x100ピクセルにする
Dim myThumbnail As Image = myBitmap.GetThumbnailImage(100, 100, Nothing, IntPtr.Zero)
'表示
g.DrawImage(myThumbnail, 0, 0)
}}

#code(csharp){{
//サムネールイメージを作成
//Bitmapオブジェクトの作成
Bitmap myBitmap = new Bitmap(@"C:\納屋.jpg");
//PictureBox1のGraphicsオブジェクトの作成
Graphics g = PictureBox1.CreateGraphics();
//サムネールイメージを作成大きさを100x100ピクセルにする
Image myThumbnail = 
    myBitmap.GetThumbnailImage(100, 100, null, IntPtr.Zero);
//表示
g.DrawImage(myThumbnail, 0, 0);
}}

画像の拡大、縮小表示とはあまり関係のないことかもしれませんが、最後の最後に自動スケーリングについて触れておきます。

元の画像と同じ大きさで表示するには

g.DrawImage(image, 10, 20)

のように表示する左上の座標を指定するだけでDrawImageメソッドを使用できますが、この時「自動スケーリング」が行われる可能性があり、パフォーマンスは低下します。「自動スケーリング」を解除するためには

g.DrawImage(image, 10, 20, image.Width, image.Height)

のように幅と高さをちゃんと指定してあげます。詳しくはヘルプの「自動スケーリングの解除によるパフォーマンスの向上」をご覧ください。

-[[画像を拡大、縮小して表示する>http://dobon.net/vb/dotnet/graphics/scaling.html]]
-[[補間方法を指定して画像を拡大、縮小表示する>http://dobon.net/vb/dotnet/graphics/interpolationmode.html]]
-[[サムネールイメージの作成>http://dobon.net/vb/dotnet/graphics/thumbnail.html]]
-[[MSDN:自動スケーリングの解除によるパフォーマンスの向上]]

**VBユーザーのためのC# [#z7098079]

***C#でLike演算子と同じことをするには? [#x7a3bccd]

#column(注意){{
この記事の最新版は「[[C#でLike演算子の代わりになるものは?>http://dobon.net/vb/dotnet/vb2cs/vblike.html]]」で公開しています。
}}

C#にVBのLike演算子はありません。これと同等の事を行うには、Regexクラス(System.Text.RegularExpression名前空間)のIsMatchメソッドを使う方法(つまり正規表現を使う方法)があります。Like演算子の"*"、"?"、"#"はそれぞれ正規表現では".*"、"."、"\d"に置き換えることが出来ます(ただし正規表現の".*"、"."は改行文字以外の文字となります)。Like演算子の"[]"は正規表現でも"[]"で、Like演算子の"[!]"は正規表現では"[^]"と表現できます。

正規表現の"."は改行文字以外の文字を表すため、改行文字を含む文字列の比較では同一の結果とならないかもしれません。このような時は一致オプションにRegexOptions.Singlelineを指定し、単一行モードとします。このことにより、"."はすべての文字と一致するようになります。

さらに、Like演算子は2つの文字列が完全に一致するかを調べるのに対して、IsMatchメソッドは一致する箇所があるが調べるものです。よって、IsMatchメソッドでは検索パターン文字列の前後に"^"と"$"を付ける必要がありそうです。

当然ですが、検索パターン文字列に正規表現で使われるメタ文字が含まれているときは、これをエスケープしておかなければいけません。(これはRegex.Escapeメソッドを使うことにより行えます。)

実際にこの変換を使用した例を下に示します。この例ではVBのLike演算子のヘルプでのサンプルをC#に変換してみました。

#code(csharp){{
//using System.Text.RegularExpressions;
//が宣言されているものとする

bool myCheck;

//myCheck = "F" Like "F"
myCheck = Regex.IsMatch("F", "^F$", RegexOptions.Singleline);
//myCheck: true

//myCheck = "F" Like "f"
myCheck = Regex.IsMatch("F", "^f$", RegexOptions.Singleline);
//myCheck: false

//myCheck = "F" Like "FFF"
myCheck = Regex.IsMatch("F", "^FFF$", RegexOptions.Singleline);
//myCheck: false

//myCheck = "aBBBa" Like "a*a"
myCheck =
    Regex.IsMatch("aBBBa", "^a.*a$", RegexOptions.Singleline);
//myCheck: true

//myCheck = "F" Like "[A-Z]"
myCheck =
    Regex.IsMatch("F", "^[A-Z]$", RegexOptions.Singleline);
//myCheck: true

//myCheck = "F" Like "[!A-Z]"
myCheck =
    Regex.IsMatch("F", "^[^A-Z]$", RegexOptions.Singleline);
//myCheck: false

//myCheck = "a2a" Like "a#a"
myCheck =
    Regex.IsMatch("a2a", "^a\\da$", RegexOptions.Singleline);
//myCheck: true

//myCheck = "aM5b" Like "a[L-P]#[!c-e]"
myCheck = Regex.IsMatch(
    "aM5b", "^a[L-P]\\d[^c-e]$", RegexOptions.Singleline);
//myCheck: true

//myCheck = "BAT123khg" Like "B?T*"
myCheck = Regex.IsMatch(
    "BAT123khg", "^B.T.*$", RegexOptions.Singleline);
//myCheck: true

//myCheck = "CAT123khg" Like "B?T*"
myCheck = Regex.IsMatch(
    "CAT123khg", "^B.T.*$", RegexOptions.Singleline);
//myCheck: false
}}

**コメント [#j56ee314]
#comment

//これより下は編集しないでください
#pageinfo([[:Category/.NET]],2003-03-17 (月) 03:29:39,DOBON!)
#pageinfo([[:Category/.NET]],2003-03-03 (月) 06:00:00,DOBON!,2010-03-20 (土) 02:18:23,DOBON!)

[ トップ ]   [ 新規 | 子ページ作成 | 一覧 | 単語検索 | 最終更新 | ヘルプ ]