前提
以下のプログラムを実行するとエラーが発生します。
エラー内容は以下の通りです。
ハンドルされていない例外: System.ArgumentException: 使用されたパラメーターが有効ではありません。 場所 System.Drawing.Image.get_Width() 場所 System.Drawing.Bitmap.GetPixel(Int32 x, Int32 y) 場所 GetPixelColor.Program.<GetPixelColorsFromBitmap>d__1.MoveNext() 場所 C:\Program\ImageTest\ImageTest\Program.cs:行 21 場所 GetPixelColor.Program.Main(String[] args) 場所 C:\Program\ImageTest\ImageTest\Program.cs:行 58
using
の効果(Dispose実行)かなりが早い段階で行われている為、bmp
オブジェクトのメソッド実行時にエラーが出力されたのかと推測します。
しかし、using
の書き方としては間違っていないと思っております。
なぜ以下のプログラムがエラーとなるか分かりません。
質問
Q. エラーの原因が不明です、なぜエラーが出力されたのでしょうか?
該当のソースコード
- rgb.png
ダウンロード
※画像ファイルへのリンクをあえて貼っています。3ピクセルしか無い為見逃す可能性がある為です。
- Program.cs
C#
1using System; 2using System.Collections.Generic; 3using System.Drawing; 4using System.Linq; 5using System.Text; 6using System.Threading.Tasks; 7 8namespace GetPixelColor 9{ 10 class Program 11 { 12 const string ImgFileName = "rgb.png"; 13 14 /// <summary> 15 /// 指定したBitmapオブジェクトからピクセルの色情報を取得する 16 /// </summary> 17 static IEnumerable<Color> GetPixelColorsFromBitmap(Bitmap bmp) 18 { 19 foreach (var x in Enumerable.Range(0, 3)) 20 { 21 yield return bmp.GetPixel(x, 0); 22 } 23 } 24 25 /// <summary> 26 /// 指定したファイル名からピクセルの色情報を取得する 27 /// </summary> 28 static IEnumerable<Color> GetPixelColorsFromFileName(string fileName) 29 { 30 // NG 31 using (var bmp = new Bitmap(ImgFileName)) 32 { 33 return GetPixelColorsFromBitmap(bmp); 34 } 35 36 /* 37 // OK1 38 using (var bmp = new Bitmap(ImgFileName)) 39 { 40 return GetColorsFromBitmap(bmp).ToArray(); 41 } 42 */ 43 44 /* 45 // OK2 46 var bmp = new Bitmap(ImgFileName); 47 return GetColorsFromBitmap(bmp); 48 */ 49 } 50 51 static void Main(string[] args) 52 { 53 foreach (var x in GetPixelColorsFromBitmap(new Bitmap(ImgFileName))) 54 { 55 Console.WriteLine($"({x.R}, {x.G}, {x.B})"); 56 } 57 58 foreach (var x in GetPixelColorsFromFileName(ImgFileName)) 59 { 60 Console.WriteLine($"({x.R}, {x.G}, {x.B})"); 61 } 62 } 63 } 64} 65
試したこと
OK1
のようにプログラムを変更
期待する出力が得られましたがなぜこの場合エラーが消えたのか不明です。
ToArray
するとなぜusing
のDipose実行タイミングが変化するのでしょうか。
OK2
のようにプログラムを変更
using
を消した為、期待する出力が得られました。
この事からusing
が原因ではないかという推測をたてることができます。
補足情報(FW/ツールのバージョンなど)
- Windows 10 64bit 1709
- Visual Studio 2017
- .NET Framework 4.6.1
- C# 7.3
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/06 13:54 編集