- PR -

C# 複数の画像をサイズ変更するには?

1
投稿者投稿内容
ぶぎ
会議室デビュー日: 2005/12/20
投稿数: 6
投稿日時: 2006-01-15 18:17
フォルダー内の全部の画像のサイズ変更するプログラムを作ろうとしています。
「.NET TIPS 画像をファイルに保存するには?」の記事を参考にして作ってみたのですが、1枚の画像ファイルのサイズ変更は無事できました。
複数の画像のサイズ変更はされているのですが、複数のファイルパスをBitmap src = new Bitmap(a[i]);の部分に代入すると、デバックした後に使用されたパラメータが有効でありませんと言われてしまいます。
a[i]はフォルダー内の複数の画像のファイルパスが入っていて、lengthはファイルの数です。

Bitmapにいきなり複数の値を入れたのがまずいのかなと思っていますが、どうすればこのエラーが消えるのかがわかりません。
わかる方いらっしゃいましたら、ご教授よろしくお願いいたします。


for(i=0; i<length; i++){

  Bitmap src = new Bitmap(a[i]);

int width = src.Width / 2;
int height = src.Height / 2;

Bitmap dest = new Bitmap(src, width, height);

dest.Save(a[i]+"2.jpg", ImageFormat.Jpeg);
}
iStation
大ベテラン
会議室デビュー日: 2003/12/08
投稿数: 158
投稿日時: 2006-01-15 19:35
a[i]を設定するコードを記載ください。
_________________
IEEE-CSDP 2004-2007
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-15 19:58
引用:

ぶぎさんの書き込み (2006-01-15 18:17) より:

使用されたパラメータが有効でありませんと言われてしまいます。


その時の a[i] の中身を式ウォッチで見てください。

引用:

Bitmapにいきなり複数の値を入れたのがまずいのかなと思っていますが、


Bitmap オブジェクトに複数の値なんて入ってますか?
コードを見る限り、どちらかというと、src, dest を明示的に解放していない方が気になります。

引用:

どうすればこのエラーが消えるのかがわかりません。


エラーではなく例外じゃないんですか?
a の型は何でしょうか?
当然、string でしょうけど、a の型についての記載がないため私には判りません。

と、このように情報が少ないです。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
清華
ベテラン
会議室デビュー日: 2005/12/21
投稿数: 50
投稿日時: 2006-01-15 20:18
こういうことですかね?

コード:
string directory = Console.ReadLine();
string[] files = Directory.GetFiles(directory);
foreach(string file in files)
{
	switch(Path.GetExtension(file))
	{
		case ".bmp":
		case ".jpeg":
		case ".jpa":
		case ".jpg":
		case ".gif":
		case ".png":
		case ".tif":
		case ".tiff":
		{
			using(Bitmap b = new Bitmap(file))
			using(Bitmap shadow = new Bitmap(b.Width/2,b.Height/2))
			using(Graphics g = Graphics.FromImage(shadow))
			{
				ImageFormat iformat = b.RawFormat;
				g.DrawImage(b,0,0,shadow.Width,shadow.Height);
				shadow.Save(file + "_ahyahoge" + Path.GetExtension(file),
					iformat);
			}
			break;
		}
		default:
			// 何もしない
			break;
	}
}



仰られている
「使用されたパラメータが有効でありません」
使用されたファイルが画像ファイルではない可能性が高いと解釈してもいいでしょう、この場合は。隠し属性のファイルなどもあるのでループ時に画像ファイルかどうかをチェックするべきです(上記コードではswitch使ってますがtry - catchでチェックするほうがお得な気がします、まずコーディング楽ですしどんな拡張子でもOKですし。)

それと
コード:
 int width = src.Width / 2;
int height = src.Height / 2;

Bitmap dest = new Bitmap(src, width, height); 


これで縮小できる(?)というのはびっくりですが、縮小時の方法など指定する場合Graphics使ったほうがお得な気がします。

ついでにJpegだけに対応するわけでは無いのであれば上記コードのように変換してあげましょう。

# といっときながら上記のコードで問題がないかちょっと自信なし。
_________________
9uiet Design - http://quietdesign.rental.allinoneserver.net/
デザインにこだわったソフトの配布とプログラミングTipsの公開(予定)をしています。
9uiet Blog - http://seiga.blog44.fc2.com/
笑ったことやプログラミングのことなど書
ぶぎ
会議室デビュー日: 2005/12/20
投稿数: 6
投稿日時: 2006-01-15 23:06
iStationさん、じゃんぬねっとさん、清華さん、レスありがとうございます。

a[i]の型は、string[]です。a[i]の中には、フォルダ内の全部の画像ファイル(jpg)のファイルパスが入ってます。
forはフ
ウォッチという部分には何も書かれていなかったみたいなのですが・・。
あとエラーではなく例外の間違いでした。

どういうことを説明すればいいのかもあんまりよくわかってなくてすみませんでした。

清華さんのおっしゃるとおり、隠しファイルによる例外でした。
落ち着いてちゃんと確認するべきでした。すみません。
解決しました。
みなさん、ありがとうございました。

[ メッセージ編集済み 編集者: ぶぎ 編集日時 2006-01-15 23:07 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-15 23:26
引用:

清華さんの書き込み (2006-01-15 20:18) より:

コード:

string[] files = Directory.GetFiles(directory);




GetFiles メソッドですが、パターン マッチングが使えますので、
その後の GetExtension などの検証は不要だと思います。

  フォルダ内のすべてのファイルを取得する

拡張子がでたらめな場合も考慮して、必ず例外処理をやっておきしょう > ぶぎさん

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
清華
ベテラン
会議室デビュー日: 2005/12/21
投稿数: 50
投稿日時: 2006-01-16 08:12
引用:

GetFiles メソッドですが、パターン マッチングが使えますので、
その後の GetExtension などの検証は不要だと思います。


これって拡張子1つにしか対応できなく無いですか?
複数の拡張子に対応できるのであればその方法を教えていただきたいです(過去調べたが僕の技量では見つけられなかった)
_________________
9uiet Design - http://quietdesign.rental.allinoneserver.net/
デザインにこだわったソフトの配布とプログラミングTipsの公開(予定)をしています。
9uiet Blog - http://seiga.blog44.fc2.com/
笑ったことやプログラミングのことなど書
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-16 09:42
引用:

清華さんの書き込み (2006-01-16 08:12) より:

これって拡張子1つにしか対応できなく無いですか?
複数の拡張子に対応できるのであればその方法を教えていただきたいです(過去調べたが僕の技量では見つけられなかった)


あ、複数ファイルは定義できないんですね...
所詮、Win のワイルドカードだから... orz
使えるワイルドカード文字は * と ? のみ...

そんなわけで負け惜しみメソッド。

コード:

    public static string[] GetFiles(string path, string[] searchExtension) {
        System.Collections.Specialized.StringCollection hFiles = (
            new System.Collections.Specialized.StringCollection()
        );

        foreach (string one in System.IO.Directory.GetFiles(path)) {
            for (int i = 0; i <= searchExtension.Length - 1; i++) {
                if (System.IO.Path.GetExtension(one) == "." + searchExtension[i]) {
                    hFiles.Add(one);
                }
            }
        }

        if (hFiles.Count <= 0) {
            return null;
        }

        string[] stFiles = new string[hFiles.Count];
        hFiles.CopyTo(stFiles, 0);

        return stFiles;
    }

コード:

    //[TestMethod()]
    private static void MakiMakiLove() {
        string[] stFiles = GetFiles(@"D:\", new string[] {"jpg", "bmp", "jpeg", "jpa", "jpg", "gif", "png", "tif", "tiff"});

        foreach (string one in stFiles) {
            Console.WriteLine(one);
        }
    }


これならば、拡張子が増えても変更は少ないですね (w

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
1

スキルアップ/キャリアアップ(JOB@IT)