3

ImageResizerライブラリを使用して、ASP.NETMVC4プロジェクトで簡単な画像のサイズ変更と回転を行っています。問題は、32 bpp CMYK JPEGファイルを処理するために使用すると、ArgumentExceptionで失敗することですが、(Windows Server 2008 R2)サーバーでのみ機能します。(WindowsVista)ラップトップでは正常に動作します。

問題のJPEGファイルは大きすぎず(700x500)、その他の点では非標準です。すべてのWebブラウザーとペイントは、問題のサーバー自体でも問題なく開くことができます。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

何か案は?

4

1 に答える 1

0

さらに調査とテストを行った結果、Bitmap.RotateFlipトリミングとサイズ変更のためにターゲット ビットマップにメソッドが描画される前に、ソース ビットマップでメソッドが呼び出された場合にのみ問題が発生することがわかりました。

System.DrawingImageResizer ライブラリの動作を変更する方法がないため、自分で単純な古いコードを書き直さなければならなくなりました。具体的には、変換行列を使用して同じことを行う独自の回転関数を作成しました。

    private Bitmap RotateImage(Bitmap source, float angle)
    {
        if (angle == 0) return (Bitmap)source.Clone();

        Bitmap target;
        using (GraphicsPath path = new GraphicsPath())
        using (Matrix matrix = new Matrix())
        {
            path.AddRectangle(new RectangleF(0.0f, 0.0f, source.Width, source.Height));
            matrix.Rotate(angle);
            RectangleF rect = path.GetBounds(matrix);

            target = new Bitmap((int)Math.Round(rect.Width), (int)Math.Round(rect.Height));
            target.SetResolution(source.HorizontalResolution, source.VerticalResolution);

            using (Graphics g = Graphics.FromImage(target))
            {
                g.TranslateTransform(-rect.X, -rect.Y);
                g.RotateTransform(angle);
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.DrawImageUnscaled(source, 0, 0);
            }
        }
        return target;
    }

PixelFormat新しいのをソースからのものに設定したかったのですBitmapが、そうすると、問題のCMYK JPEGファイルに遭遇すると、奇妙なGDI +「メモリ不足」エラーがスローされます。これは、この奇妙な動作が、Windows 7/Server 2008 R2 と Windows Vista/Server 2008 で異なる値を返すこのGDI+ バグ/癖に関連しているのかどうか疑問に思います。ImageFlagsPixelFormat

于 2012-11-25T00:44:37.330 に答える