1

写真のサイズを変更してトリミングし、結果の画像ファイルを保存する関数を作成しました。私の開発環境では問題なく動作しますが、本番環境では結果の画像が「粗い」ものになります。ここで異なる品質を見ることができますhttp://test.powersport.it/canc2.aspx

サイズ変更およびトリミングされた画像を生成するコードは次のとおりです

    // width: width of cropped img - height: height of cropped img
    System.Drawing.Bitmap thumbnail = new Bitmap(width, height);
    // image: original System.Drawing.Image containing full size img
    thumbnail.SetResolution(image.HorizontalResolution, image.VerticalResolution);
    // size[0]: width of resized img - size[1]: height of resized image
    System.Drawing.Image mini = new Bitmap(image, size[0], size[1]);
    System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(thumbnail);

    g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    g.SmoothingMode = SmoothingMode.HighQuality;
    g.PixelOffsetMode = PixelOffsetMode.HighQuality;
    g.CompositingQuality = CompositingQuality.HighQuality;

    g.DrawImage(mini, ((width - size[0]) / 2), ((height - size[1]) / 2), size[0], size[1]);

    EncoderParameters encoderParameters;
    encoderParameters = new EncoderParameters(1);
    ImageCodecInfo[] info = ImageCodecInfo.GetImageEncoders();

    // img: original file name
    switch (Path.GetExtension(img).ToLower())
    {
        case ".png": //       info[4]
            thumbnail.Save(dest, System.Drawing.Imaging.ImageFormat.Png);
            break;
        case ".bmp": //       info[0]
            thumbnail.Save(dest, System.Drawing.Imaging.ImageFormat.Bmp);
            break;
        case ".tiff": //      info[3]
            encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionLZW);
            thumbnail.Save(dest, info[3], encoderParameters);
            break;
        case ".tif": //      info[3]
            encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Compression, (long)EncoderValue.CompressionLZW);
            thumbnail.Save(dest, info[3], encoderParameters);
            break;
        default: //jpeg      info[1]
            encoderParameters.Param[0] = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, compression);
            thumbnail.Save(dest, info[1], encoderParameters);
            break;
    }

どんな助けでも大歓迎です。ありがとう。

更新:PNG、BMP、およびTIFFで試しましたが、同じ問題があります

4

2 に答える 2

1

各マシンには、まったく同じインデックスでまったく同じエンコーダーがあると想定しています。

ファイル拡張子に関係なく、各マシンが実際には異なる形式で画像を圧縮している可能性があります。

WS2008 と WS2008 R2 には異なるグラフィック サブシステムがあります。後者の場合、GDI+ は WIC エンコーダーの単なるラッパーであり、さまざまな癖があります。

これらの違いを処理するライブラリを使用することに決めていただければ幸いです。サーバー側のイメージングは​​単純でも直感的でもなく、避けなければならない落とし穴が無数にあります。System.Drawingここで発生しているエンコーディングの問題は別として、.NET が実際に名前空間からクラスをガベージ コレクションするという印象を受けているようです。そうではなく、すべての参照がusing(){}句の中にない限り、深刻な安定性の問題が発生します。

于 2013-02-12T14:34:49.297 に答える