1

WPF で .jpg ファイルを開き、約 50% に縮小してからファイル システムに保存したいと考えています。それを行うための良い/効率的な方法は何ですか?

4

3 に答える 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 に答える
0

この質問に対する賛成票が最も多い回答を見てください。画像を操作するためのヘルパー クラスを提供します。ResizeImage機能と機能を見てみましょうSaveJpeg

編集:

ここで、よりWPF固有のものを見つけました。

于 2009-11-20T14:37:05.307 に答える