【发布时间】:2012-11-22 19:54:32
【问题描述】:
我正在使用 ImageResizer 库在 ASP.NET MVC 4 项目中进行一些简单的图像大小调整和旋转。问题是,当我使用它处理 32-bpp CMYK JPEG 文件时,它会因 ArgumentException 而失败,但仅在我的 (Windows Server 2008 R2) 服务器上 - 它在我的 (Windows Vista) 笔记本电脑上运行良好。
有问题的 JPEG 文件不是太大 (700x500) 或其他非标准文件 - 所有网络浏览器和 Paint 都可以很好地打开它们,即使在有问题的服务器本身上也是如此。 JPEG 是使用 ImageMagick 生成的,如果我要求 ImageMagick 使用 RGB 颜色空间,一切正常 (-colorspace sRGB.)
奇怪的是,调整图像大小在所有情况下都可以正常工作,但如果我尝试在服务器上调整大小和旋转图像,它会失败。
看起来一些较低级别的 Win32 或 GDI+ 函数调用在这里失败了 - 这是堆栈跟踪的相关部分:
[ArgumentException: Parameter is not valid.]
System.Drawing.Graphics.CheckErrorStatus(Int32 status) +1621285
System.Drawing.Graphics.DrawImage(Image image, PointF[] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr, DrawImageAbort callback, Int32 callbackData) +727
System.Drawing.Graphics.DrawImage(Image image, PointF[] destPoints, RectangleF srcRect, GraphicsUnit srcUnit, ImageAttributes imageAttr) +73
ImageResizer.ImageBuilder.RenderImage(ImageState s) +763
ImageResizer.ImageBuilder.Render(ImageState s) +174
ImageResizer.ImageBuilder.Process(ImageState s) +105
ImageResizer.ImageBuilder.buildToBitmap(Bitmap source, ResizeSettings settings, Boolean transparencySupported) +276
ImageResizer.ImageBuilder.buildToStream(Bitmap source, Stream dest, ResizeSettings settings) +149
ImageResizer.ImageBuilder.BuildJob(ImageJob job) +940
ImageResizer.ImageBuilder.Build(ImageJob job) +223
有什么想法吗?
【问题讨论】:
-
您使用的是“旋转”还是“旋转”? GDI 在 WS2008 R2 内部使用 WIC,并且似乎正在加载 CMYK 数据,但似乎实际上不能支持对其进行旋转操作。
rotate应该可以工作,即使srotate(源旋转)不工作。 -
@ComputerLinguist 我使用的是 srotate——我的应用需要先旋转图像,然后再裁剪。
-
@ComputerLinguist 我想这正是 ImageResizer 之类的库存在的原因——抽象出这些奇怪的错误和怪癖。也许你可以考虑更新它来处理这种情况。
-
绝对在TODO清单上;事实上,我已经对其进行了测试,但忘记测试“旋转”和“旋转”。如果你在 GitHub 上,你甚至可以提交一个补丁来加快速度。
-
此错误已在 3.3.1 版本中修复。
标签: c# asp.net system.drawing imageresizer