DOBON.NET DOBON.NETプログラミング掲示板過去ログ

Bitmap保存時にArgumentException

環境/言語:[WindowsXP Pro, VB.NET, .Net Framework1.1, VS2003]
分類:[.NET]

はじめまして。いつも参考にさせて頂いてます。

早速質問をさせていただきます。


現在、テンプレートとしてのbmpファイルを編集し、1bppIndexedのtiffに変換して保存するという処理を作成しています。
画像の編集に関してはうまくいくのですが、保存するところでArgumentExceptionが発生してしまいます。
実際のソースコード(Saveメソッドの近くのみ書き出し)は下記のとおりです。


'編集したイメージを白黒に変換して保存する
infoCodec = GetEncoderInfo("image/tiff")
paramEncoders = New System.Drawing.Imaging.EncoderParameters
paramEncoders.Param(0) = New System.Drawing.Imaging.EncoderParameter(System.Drawing.Imaging.Encoder.Compression, System.Drawing.Imaging.EncoderValue.CompressionCCITT3)
'保存する前に同じファイルがあったら削除する
If System.IO.File.Exists(g_strWrkFolderPath & "\wrk" & i.ToString & ".tiff") Then
System.IO.File.Delete(g_strWrkFolderPath & "\wrk" & i.ToString & ".tiff")
End If
'編集後のイメージを1bppIndexedに変換
imgWrk = TranslateTo1bppIndexed(imgTemp)
'変換後のイメージをtiffで保存
imgWrk.Save(g_strWrkFolderPath & "\wrk" & i.ToString & ".tiff", infoCodec, paramEncoders)



この最後のSaveのところでArgumentException(使用されたパラメータが無効です。)が発生してしまいます。

調べてみたところ、保存先(上書き)ファイルにアクセス権が無い場合に発生することがあるようですが、それを危惧してあらかじめファイルの削除を行っているので、別に原因があるように思われます。(ステップ実行で手動削除も試してみましたが、結果は同じでした。)

また、過去ログ(http://dobon.net/vb/bbs/log3-4/2354.html)でPictureBoxを経由することで回避できたとあったので試してみましたが、やはり結果は同じでした。

数日前までは問題なく保存できていたのですが、この処理周りでのソースの変更はしていないつもりです。


原因の分かる方、打開策をお持ちの方、どうぞご助力お願いします。
こんにちは。

これだけでは回答は難しいかもしれません。

必要なのは「実際のソースコード」よりも「ミニマムコード」であって、このコードでは

・GetEncoderInfo() / TranslateTo1bppIndexed() がどんな関数かわからない(戻り値も不明)
・infoCodec / imgWrk の型がわからない

ので、結局これだけ見ても何をしているのか把握するのは難しそうです。
せっかく「使用されたパラメータが無効です」と親切にエラーが返ってきているので、そ
れを元にパラメータを調べてみるのもいかがでしょうか。
本題とは関係ありませんが。。。

> 調べてみたところ、保存先(上書き)ファイルにアクセス権が無い場合に発生することがあるようですが、それを危惧してあらかじめファイルの削除を行っているので、別に原因があるように思われます。(ステップ実行で手動削除も試してみましたが、結果は同じでした。)

アクセス権が無いなら削除も出来ないので、無意味なんじゃないでしょうか。
ご回答ありがとうございます。

確かに関数や変数の定義が分からないと答えようがありませんでした。

関数二つに関しては過去ログ(http://dobon.net/vb/bbs/log3-3/1509.html)を参考にしました。
・Private Shared Function GetEncoderInfo(str As String) As System.Drawing.Imaging.ImageCodecInfo
→ 過去ログのID:1509の記事より。
・Public Shared Function TranslateTo1bppIndexed(img As Bitmap) As Bitmap
→ 過去ログのID:1632の記事より。引数(閾値)を減らしたもの。内部処理は同じです。

変数の型に関しては下記の通りです。
・infoCodec → System.Drawing.Imaging.ImageCodecInfo
・imgWrk → Bitmap


Saveメソッドでのパラメータに関しては最初に作成してから一度も変更していないので、以前保存できていた際と同じ状況だとは思うのですが、どちらもシステムから取得している値なので、問題はないと思っています。
追記です。

16487の書き込みのソースコードの最後の2行を

imgWrk = imgTemp
imgWrk.Save(g_strWrkFolderPath & "\wrk" & i.ToString & ".tiff", infoCodec, paramEncoders)

と変更(1bppIndexed変換をしない)しても同様のエラーが発生しましたので、TranslateTo1bppIndexed()の関数は今回の件とは関係がないと思われます。



■No16491に返信(渋木宏明(ひどり)さんの記事)
ご回答ありがとうございます。
ご指摘の件、おっしゃるとおりです。
Try/Catchで捕まえて、別名に保存するように変更しようと思います。
さらに追記です。

Saveメソッドのパラメータを下記のように変更しました。

imgWrk.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\test.tiff")

結果はやはり同様のエラーが発生しました。

もうひとつ

Dim fs As New System.IO.FileStream(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\test.tiff", IO.FileMode.Create)
imgWrk.Save(fs, infoCodec, paramEncoders)

ともしてみましたが、やはり同じでした。
またまた本題と関係ないですが。。。

> imgWrk.Save(Environment.GetFolderPath(Environment.SpecialFolder.Desktop) & "\test.tiff")

パスの結合には Path.Combine() を使いましょう。

DOBON.NET | プログラミング道 | プログラミング掲示板