WPF で .jpg ファイルを開き、約 50% に縮小してからファイル システムに保存したいと考えています。それを行うための良い/効率的な方法は何ですか?
質問する
2121 次
3 に答える
1
メモリ使用量を節約したい場合は、BitmapImage または JpegDecoder で DecodePixelWidth/DecodePixelHeight を指定することを検討する必要があります。
スケーリングはTransformedBitmapを使用して実行できます。
于 2009-11-20T14:39:36.170 に答える
1
ここでは 2 つの関数を使用しました。ResizeImage は、元のイメージをバイト配列として受け入れ、ターゲット サイズをピクセル単位で受け入れます。この関数は、サイズ変更されたイメージをバイト配列として返します。ファイルに書き込むことができます。
次の手順を実行します
1) BinaryReader を使用してイメージをバイト配列として読み取る
2) この配列とイメージのターゲット サイズを渡して ResizeImage 関数を呼び出します。
3) 返された値を Byte 配列に格納する
4) BinaryWriter を使用してファイルに書き込みます
byte[] ResizeImage(byte[] imageFile, int targetSize)
{
System.Drawing.Image oldImage = System.Drawing.Image.FromStream(new MemoryStream(imageFile));
System.Drawing.Size newSize = CalculateDimensions(oldImage.Size, targetSize);
using (System.Drawing.Bitmap newImage = new System.Drawing.Bitmap(oldImage, (int)newSize.Width, (int)newSize.Height))
{
using (System.Drawing.Graphics canvas = System.Drawing.Graphics.FromImage(newImage))
{
canvas.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
canvas.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
canvas.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.HighQuality;
canvas.DrawImage(oldImage, new System.Drawing.Rectangle(new System.Drawing.Point(0, 0), newSize));
MemoryStream m = new MemoryStream();
newImage.Save(m, System.Drawing.Imaging.ImageFormat.Jpeg);
return m.GetBuffer();
}
}
}
System.Drawing.Size CalculateDimensions(System.Drawing.Size oldSize, int targetSize)
{
System.Drawing.Size newSize = new System.Drawing.Size();
if (oldSize.Height > oldSize.Width)
{
newSize.Width = (int)(oldSize.Width * ((float)targetSize / (float)oldSize.Height));
newSize.Height = targetSize;
}
else
{
newSize.Width = targetSize;
newSize.Height = (int)(oldSize.Height * ((float)targetSize / (float)oldSize.Width));
}
return newSize;
}
于 2009-11-21T15:15:33.920 に答える