入力画像を取得し、画像に対していくつかのことを行い、それを別のファイルに保存するメソッドがあります。最も基本的には画像のサイズを変更しますが、グレースケールへの変換、量子化など、いくつかのより複雑なことを実行できますが、この質問の場合、画像のサイズを変更しようとしているだけで、他のアクションは実行していません.
次のようになります。
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
と、正常に機能し、画像ファイルが完全に作成されます。
イメージの作成と、作成されたイメージ (上記のコードではなく) にアクセスしようとするコードの他の場所との間に何らかの遅延が発生し、ファイルがロックされて書き込まれないのではないかと考えています。それは事実でしょうか?
他に何が起こっているのでしょうか?
乾杯
編集:
- ロイドによって指摘された冗長なキャストを削除します