ImageResizer - Error converting PSD file - System.ArgumentException: Parameter is not valid
I have a system where i upload single files to the webserver. Once uploaded i trigger a command to generate different sizes of the files.
The files uploaded are PSD and should be converted into pngs and jpgs.
The upload works fine and i can see the file in the directory. But when the "generate versions" command is fired i get this error
"file may be corrupted empty, or may contain a png image with a single dimension greater than 65535"
It's the line
generatedFiles.Add(ImageBuilder.Current.Build(file, strDestinationPath, objResizeCommand, false, true));
The full command is
public IList<string> GenerateVersions(decimal id, string file, string filename)
{
List<string> generatedFiles = new List<string>();
foreach (var tCmdSets in db.IMG_SETTINGS_CMDSETS.Where("it.SETTINGS_FOLDER_ID = @folderid", new ObjectParameter("folderid", id)))
{
var strDestinationPath = ImageResizer.Util.PathUtils.RemoveExtension(Path.Combine(tmpDefaultFolder, tCmdSets.SETTINGS_CMDSET_DESTINATION, filename));
ResizeSettings objResizeCommand = new ResizeSettings(tCmdSets.SETTINGS_CMDSET_COMMAND);
generatedFiles.Add(ImageBuilder.Current.Build(file, strDestinationPath, objResizeCommand, false, true));
}
return generatedFiles;
}
and the variables fill until the error are:
file "c:\\www\\upload\\masters\\Products\\upload_test.psd" string
objResizeCommand {?maxwidth=800&maxheight=600&format=jpg} ImageResizer.ResizeSettings
strDestinationPath "c:\\www\\upload\\converted\\items\\big\\upload_test" string
here is the stack trace
[ArgumentException: Parameter is not valid.]
ImageResizer.ImageBuilder.LoadImage(Object source, ResizeSettings settings) in C:\Users\Administrator\Documents\resizer\Core\ImageBuilder.cs:186
[ImageCorruptedException (0x80004005): File may be corrupted, empty, or may contain a PNG image with a single dimension greater than 65,535 pixels.]
ImageResizer.ImageBuilder.LoadImage(Object source, ResizeSettings settings) in C:\Users\Administrator\Documents\resizer\Core\ImageBuilder.cs:190
ImageResizer.ImageBuilder.Build(Object source, Object dest, ResizeSettings settings, Boolean disposeSource, Boolean addFileExtension) in C:\Users\Administrator\Documents\resizer\Core\ImageBuilder.cs:306
imageController.Classes.ImageHandling.GenerateVersions2(String original) in C:\Users\tha\Documents\Visual Studio 2010\Projects\imageController\imageController\Classes\ImageHandling.cs:26
imageController.Controllers.UploadController.UploadSingleFile(Decimal id, HttpPostedFileBase objFile) in C:\Users\tha\Documents\Visual Studio 2010\Projects\imageController\imageController\Controllers\UploadController.cs:62
lambda_method(Closure , ControllerBase , Object[] ) +261
System.Web.Mvc.ActionMethodDispatcher.Execute(ControllerBase controller, Object[] parameters) +17
System.Web.Mvc.ReflectedActionDescriptor.Execute(ControllerContext controllerContext, IDictionary`2 parameters) +208
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethod(ControllerContext controllerContext, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +27
System.Web.Mvc.<>c__DisplayClass15.<InvokeActionMethodWithFilters>b__12() +55
System.Web.Mvc.ControllerActionInvoker.InvokeActionMethodFilter(IActionFilter filter, ActionExecutingContext preContext, Func`1 continuation) +263
System.Web.Mvc.<>c__DisplayClass17.<InvokeActionMethodWithFilters>b__14() +19
System.Web.Mvc.ControllerA开发者_运维知识库ctionInvoker.InvokeActionMethodWithFilters(ControllerContext controllerContext, IList`1 filters, ActionDescriptor actionDescriptor, IDictionary`2 parameters) +191
System.Web.Mvc.ControllerActionInvoker.InvokeAction(ControllerContext controllerContext, String actionName) +343
System.Web.Mvc.Controller.ExecuteCore() +116
System.Web.Mvc.ControllerBase.Execute(RequestContext requestContext) +97
System.Web.Mvc.ControllerBase.System.Web.Mvc.IController.Execute(RequestContext requestContext) +10
System.Web.Mvc.<>c__DisplayClassb.<BeginProcessRequest>b__5() +37
System.Web.Mvc.Async.<>c__DisplayClass1.<MakeVoidDelegate>b__0() +21
System.Web.Mvc.Async.<>c__DisplayClass8`1.<BeginSynchronous>b__7(IAsyncResult _) +12
System.Web.Mvc.Async.WrappedAsyncResult`1.End() +62
System.Web.Mvc.<>c__DisplayClasse.<EndProcessRequest>b__d() +50
System.Web.Mvc.SecurityUtil.<GetCallInAppTrustThunk>b__0(Action f) +7
System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22
System.Web.Mvc.MvcHandler.EndProcessRequest(IAsyncResult asyncResult) +60
System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.EndProcessRequest(IAsyncResult result) +9
System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +8897857
System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
When using the managed API with ASP.NET, but not the HttpModule, you need to call
protected void Application_Start()
{
ImageResizer.Configuration.Config.Current.Plugins.LoadPlugins();
}
in Global.asax.cs in addition to the following web.config settings
<configSections>
<section name="resizer" type="ImageResizer.ResizerSection" requirePermission="false" />
</configSections>
<resizer>
<plugins>
<add name="PsdReader" />
</plugins>
</resizer>
Otherwise the plugins will not be registered when you don't use the Http Modules.
You can verify the correct loading of plugins by calling
ImageResizer.Configuration.Config.Current.GetDiagnosticsPage()
This page also shows the supported filetypes (.psd, if plugin is loaded correctly).
Thanks to Nathanael (Owner of ImageResizer) for pointing me to this solution.
SOLVED
You need to add the following to you web.config file
<configSections>
<section name="resizer" type="ImageResizer.ResizerSection"/>
</configSections>
<resizer>
<sizelimits />
<diskcache enabled="false" />
<remotereader signingKey="ag383ht23sag#laf#lafF#oyfafqewt;2t w eyfwfefwqefqw" allowAllSignedRequests="true" />
<plugins>
<add name="DiskCache" />
<add name="PsdReader" />
<add name="PrettyGifs" />
<add name="Image404" />
<add name="AnimatedGifs" />
<add name="Gradient" />
<add name="SimpleFilters" />
<add name="RemoteReader" />
<add name="AdvancedFilters" />
<add name="CloudFront" />
<add name="SeamCarving" />
<add name="FolderResizeSyntax" />
<add name="ImageHandlerSyntax" />
<add name="MyCode.MyPlugins.SamplePlugin" />
<add name="WhitespaceTrimmer" />
</plugins>
</resizer>
<httpModules>
<add name="ImageResizingModule" type="ImageResizer.InterceptModule"/>
</httpModules>
<modules runAllManagedModulesForAllRequests="true">
<add name="ImageResizingModule" type="ImageResizer.InterceptModule"/>
</modules>
\T
Actually, all you need to do is add <add name="PsdReader" />
to the <plugins/>
section. The other stuff is only needed for the URL syntax, not the managed API.
精彩评论