5

imageresizing.net の画像リサイザーを使用していますが、奇妙な動作が見られます。

ストリームから画像を読み込んで画像のサイズを変更すると、元の画像のプロパティにアクセスできなくなります。

次のコードは問題を再現します。

 static void Main(string[] args)
        {
            using(var httpPostedFileBaseImage = new FileStream(@"C:\test.jpg",FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                using(var uploadedImage = Image.FromStream(httpPostedFileBaseImage))
                {

                    Console.WriteLine(uploadedImage.Width);
                    var resizedImage = ImageBuilder.Current.Build(uploadedImage,
                                                                  new ResizeSettings("width=110;height=83"));

                    Console.WriteLine(uploadedImage.Width);
                }
            }
        }

ImageBuilder 行の前に、uploadedImage.Width を確認できますが、その後で例外がスローされます。

System.ArgumentException was unhandled
  HResult=-2147024809
  Message=Parameter is not valid.
  Source=System.Drawing
  StackTrace:
       at System.Drawing.Image.get_Width()
       at ConsoleApplication6.Program.Main(String[] args) in C:\Users\Daniel\Desktop\ConsoleApplication6\ConsoleApplication6\Program.cs:line 25
       at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: 

ここで間違っていることがありますか、それとも画像リサイズのバグである可能性がありますか?

注:問題はもともと、画像がアップロードされたasp.net mvcアプリからのものでした。そのため、変数はhttpPostedFileBaseImageと呼ばれ、おそらくImage.FromFileの代わりにImage.FromStreamを使用しています

画像はありここに画像の説明を入力ますが、ほとんどの画像で発生するようです。

編集:

画像のサイズを変更した後、次のことを試してみましたが役に立ちませんでした

httpPostedFileBaseImage.Seek(0, SeekOrigin.Begin);

EDIT2:

これが私を混乱させたものです ここに画像の説明を入力

ドキュメントは、「disposeSource=true でない限り破棄されない、またはこれを読み違えているのではないか?」と示唆しているようです。

4

2 に答える 2

6

どうして見逃したのかわかりませんが、ソースを破棄しないように指示する ImageBuilder へのパラメーターがあります

var resizedImage = ImageBuilder.Current.Build(uploadedImage,new ResizeSettings("width=110;height=83"),false);

これで修正されますが、ドキュメントにはデフォルトで false と書かれているので奇妙です

于 2012-08-01T00:06:02.437 に答える
0

ストリーム位置を 0 にリセットしようとしましたか? 画像サイズ変更ライブラリが前に移動した場合は、再度使用する前に巻き戻す必要があります。

于 2012-07-31T07:00:03.703 に答える