「C#」 ハンドルされていない例外

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
koiroke

「C#」 ハンドルされていない例外

#1

投稿記事 by koiroke » 7年前

私はC#で画像処理を勉強しています。そこで早速作ってみたプログラムでエラーが起こります。
エラーの内容はデバッグなしで実行すると、以下のようなエラー文が表示されるというものです。
どなたか解決方法をご教授ください。

ハンドルされていない例外: System.ArgumentException: 使用されたパラメーターが有効
ではありません。
場所 System.Drawing.Bitmap..ctor(String filename)
場所 LoadBitmap.Program.Main(String[] args) 場所 c:\users\翔平\documents\visu
al studio 2010\Projects\SampleProgram2\SampleProgram2\Program.cs:行 14
続行するには何かキーを押してください . . .

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;   // 追加

namespace LoadBitmap
{
    class Program
    {
        static void Main(string[] args)
        {
            // 画像を格納するためのBitmapオブジェクト作成
            Bitmap bitmap = new Bitmap("test.bmp");

            // bitmapのピクセルデータを格納するための配列
            byte[,] data = new byte[bitmap.Width, bitmap.Height];

            // bitmapオブジェクトの画像ピクセル値を配列に挿入
            for (int i = 0; i < bitmap.Height; i++)
            {
                for (int j = 0; j < bitmap.Width; j++)
                {
                    // ここではグレイスケールに変換して格納
                    data[j, i] =
                        (byte)(
                        (bitmap.GetPixel(j, i).R +
                        bitmap.GetPixel(j, i).B +
                        bitmap.GetPixel(j, i).G) / 3)
                        ;
                }
            }
        }
    }
}

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: 「C#」 ハンドルされていない例外

#2

投稿記事 by YuO » 7年前

koiroke さんが書きました:エラーの内容はデバッグなしで実行すると、以下のようなエラー文が表示されるというものです。
とりあえず,「デバッグなしで実行」をする必要性を考えた方が良いです。
例外が発生している状況である以上,デバッガの機能を使うのが普通です。
koiroke さんが書きました:ハンドルされていない例外: System.ArgumentException: 使用されたパラメーターが有効
ではありません。
場所 System.Drawing.Bitmap..ctor(String filename)
場所 LoadBitmap.Program.Main(String[] args) 場所 c:\users\翔平\documents\visu
al studio 2010\Projects\SampleProgram2\SampleProgram2\Program.cs:行 14
koiroke さんが書きました:

コード:

            Bitmap bitmap = new Bitmap("test.bmp");
まず,ファイルが存在しない場合,MSDNの記述と異なり,BitmapクラスのコンストラクタはArgumentExceptionを発生させます。
# 少なくとも私の環境において。
これは,Gdiplus::DllExports::GdipCreateBitmapFromFileに存在しないファイル名を渡すとGdiplus::(Status::)InvalidParameterを返すことからの必然で,GDI+の動作が変わったのか,単なるドキュメントの記述ミスかはわかりません。

BItmapの生成前に,

コード:

Console.WriteLine(System.IO.File.Exists("test.bmp"));
と記述した場合,コンソールにはTrueと表示されるでしょうか。
Falseと表示されるのであれば,単純にファイルが存在しないことが原因です。
相対パスではなく,絶対パスを使ってファイルを指定してください。

koiroke

Re: 「C#」 ハンドルされていない例外

#3

投稿記事 by koiroke » 7年前

お返事ありがとうございます。かなり詳しく書いてもらい参考になりました。
早速Console.WriteLine(System.IO.File.Exists("jack.bmp"));を
追記してデバッグしてみたところ False と出力されました。
おっしゃる通りファイルが存在していないのだと思います。
そこで絶対パスでファイルを指定する場合、
Bitmap bitmap = new Bitmap("C:\Users\翔平\Documents\Visual Studio 2010\Projects\SampleProgram2\SampleProgram2\test.bmp");
で宜しいのでしょうか。
これだと¥の後ろにエラーが出てしまいます。

アバター
雨ガエル
記事: 34
登録日時: 7年前
住所: 新潟
連絡を取る:

Re: 「C#」 ハンドルされていない例外

#4

投稿記事 by 雨ガエル » 7年前

絶対パスを指定するときは、
@"C:\test\sample.bmp" と書くか、
"C:\\test\\sample.bmp" と書きます。
"C:/test/sample.bmp"でも良かったかもしれません。(覚え書きなので確認してみてください。)

それより、相対パスを使ってはどうでしょうか。
おそらく、初期状態では実行ファイルのあるフォルダにパスが通っていると思うので、
プロジェクトフォルダ/bin/debug/ここ
にファイルを置いて試してみてはどうですか。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: 「C#」 ハンドルされていない例外

#5

投稿記事 by YuO » 7年前

koiroke さんが書きました:そこで絶対パスでファイルを指定する場合、
Bitmap bitmap = new Bitmap("C:\Users\翔平\Documents\Visual Studio 2010\Projects\SampleProgram2\SampleProgram2\test.bmp");
で宜しいのでしょうか。
だめです。
文字列定数中での\はエスケープシーケンスの開始を意味するので,\\とするか,逐次文字列(@を最初の"の前に前置)にする必要があります。
さらに,絶対パスはハードコーディングするのではなく,実行ファイルのディレクトリを取得し,そこからパスを合成して取得する必要があります。
さらに,test.bmpは「出力ディレクトリにコピー」プロパティを「新しい場合はコピーする」にして,出力ディレクトリにコピーするようにしておきます。

単純に書くなら,

コード:

var entryLocation = System.Reflection.Assembly.GetEntryAssembly().Location;
var bitmapFile = System.IO.Path.Combine(System.IO.Path.GetDirectoryName(entryLocation), "test.bmp");
のようにします。
雨ガエル さんが書きました:それより、相対パスを使ってはどうでしょうか。
おそらく、初期状態では実行ファイルのあるフォルダにパスが通っていると思うので、
プロジェクトフォルダ/bin/debug/ここ
にファイルを置いて試してみてはどうですか。
相対パスの基準となるディレクトリはどこにおくのですか。
通常,相対パスだけを書いた場合はカレントディレクトリからの相対パスになりますが,カレントディレクトリは様々な要因で変化し,
さらに起動時に実行プログラムのあるパスがカレントディレクトリになっているとは限りません。
# ちなみに,OpenFileDialog/SaveFileDialogでも変化する場合があります。
このため,相対パスで書くことは推奨できません。

koiroke

Re: 「C#」 ハンドルされていない例外

#6

投稿記事 by koiroke » 7年前

雨ガエルさんの相対パスの方法とYuOさんの絶対パスの方法の両方を試しました。
どちらもファイルの読み込みに成功し実行できました。
問題解決に協力していただきありがとうございました。
1つの質問で2つの手段を勉強できて幸いです。
今後ともよろしくお願いします。

閉鎖

“C言語何でも質問掲示板” へ戻る