Мы используем средство изменения размера изображения с сайта 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.FromStream вместо, возможно, Image.FromFile
. Изображение , но это происходит на большинстве изображений.
РЕДАКТИРОВАТЬ:
Пробовал следующее после изменения размера изображения безрезультатно
httpPostedFileBaseImage.Seek(0, SeekOrigin.Begin);
РЕДАКТИРОВАТЬ2:
Вот это меня смутило
Документация, кажется, предполагает, что «он не будет удален, если disposeSource=true, или я неправильно это понимаю?