4

入力画像を取得し、画像に対していくつかのことを行い、それを別のファイルに保存するメソッドがあります。最も基本的には画像のサイズを変更しますが、グレースケールへの変換、量子化など、いくつかのより複雑なことを実行できますが、この質問の場合、画像のサイズを変更しようとしているだけで、他のアクションは実行していません.

次のようになります。

public void SaveImage(string src, string dest, int width, int height, ImageFormat format, bool deleteOriginal, bool quantize, bool convertToGreyscale) {
    // Open the source file
    Bitmap source = (Bitmap)Image.FromFile(src);

    // Check dimensions
    if (source.Width < width)
        throw new Exception();
    if (source.Height < height)
        throw new Exception();

    // Output image
    Bitmap output = new Bitmap(width, height);
    using (Graphics g = Graphics.FromImage(output)) {
        // Resize the image to new dimensions
        g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
        g.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality;
        g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
        g.DrawImage(source, 0, 0, width, height);
    }

    // Convert to greyscale if supposed to
    if (convertToGreyscale) {
        output = this.ConvertToGreyscale(output);
    }

    // Save the image
    if (quantize) {
        OctreeQuantizer quantizer = new OctreeQuantizer(255, 8);
        using (var quantized = quantizer.Quantize(output)) {
            quantized.Save(dest, format);
        }
    }
    else {
        output.Save(dest, format);
    }

    // Close all the images
    output.Dispose();
    source.Dispose();

    // Delete the original
    if (deleteOriginal) {
        File.Delete(src);
    }
}

それを使用するには、次のように呼び出します。imageService.SaveImage("c:\image.png", "c:\output.png", 300, 300, ImageFormat.Png, false, false, false);

これにより、「image.png」ファイルが開き、300×300 にサイズ変更され、PNG ファイルとして「output.png」に保存されます。しかし、うまくいきません。作成されたファイルは正しい場所にありますが、ファイル サイズがゼロで、画像がまったく含まれていません。

これは、パラメーターを渡したときにのみ発生するようImageFormat.Pngです。を渡すImageFormat.Jpegと、正常に機能し、画像ファイルが完全に作成されます。

イメージの作成と、作成されたイメージ (上記のコードではなく) にアクセスしようとするコードの他の場所との間に何らかの遅延が発生し、ファイルがロックされて書き込まれないのではないかと考えています。それは事実でしょうか?

他に何が起こっているのでしょうか?

乾杯

編集:

  • ロイドによって指摘された冗長なキャストを削除します
4

2 に答える 2

0

ファイル名の代わりに Stream で Save() パラメータを使用すると、オブジェクトが破棄される前にファイルがディスクにフラッシュされることを確認できます。

ただし、火遊びをしているので、ここではサーバーセーフな画像処理ライブラリを使用することを強くお勧めします。

于 2013-02-12T13:55:37.770 に答える