画像のサイズを変更する方法 C# 質問する

画像のサイズを変更する方法 C# 質問する

Size、およびWidthはのプロパティHeightです。C # で実行時に Image オブジェクトのサイズを変更するにはどうすればよいですか?Get()System.Drawing.Image

今は、以下を使用して新しいものを作成していますImage:

// objImage is the original Image
Bitmap objBitmap = new Bitmap(objImage, new Size(227, 171));

ベストアンサー1

これにより、高品質のサイズ変更が実行されます。

/// <summary>
/// Resize the image to the specified width and height.
/// </summary>
/// <param name="image">The image to resize.</param>
/// <param name="width">The width to resize to.</param>
/// <param name="height">The height to resize to.</param>
/// <returns>The resized image.</returns>
public static Bitmap ResizeImage(Image image, int width, int height)
{
    var destRect = new Rectangle(0, 0, width, height);
    var destImage = new Bitmap(width, height);

    destImage.SetResolution(image.HorizontalResolution, image.VerticalResolution);

    using (var graphics = Graphics.FromImage(destImage))
    {
        graphics.CompositingMode = CompositingMode.SourceCopy;
        graphics.CompositingQuality = CompositingQuality.HighQuality;
        graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
        graphics.SmoothingMode = SmoothingMode.HighQuality;
        graphics.PixelOffsetMode = PixelOffsetMode.HighQuality;

        using (var wrapMode = new ImageAttributes())
        {
            wrapMode.SetWrapMode(WrapMode.TileFlipXY);
            graphics.DrawImage(image, destRect, 0, 0, image.Width,image.Height, GraphicsUnit.Pixel, wrapMode);
        }
    }

    return destImage;
}
  • wrapMode.SetWrapMode(WrapMode.TileFlipXY)画像の境界のゴーストを防ぎます。単純なサイズ変更では画像の境界を超えた透明ピクセルがサンプリングされますが、画像をミラーリングすることでより良いサンプリングが得られます (この設定は非常に顕著です)
  • destImage.SetResolution物理的なサイズに関係なくDPIを維持するため、画像のサイズを縮小したり印刷したりすると品質が向上する可能性があります。
  • 合成は、ピクセルを背景とどのようにブレンドするかを制御します。1 つのものだけを描画するので、合成は必要ないかもしれません。
    • graphics.CompositingModeソース画像のピクセルを背景ピクセルに上書きするか、または結合するかを決定します。SourceCopy色がレンダリングされるときに背景色を上書きすることを指定します。
    • graphics.CompositingQualityレイヤー化された画像のレンダリング品質レベルを決定します。
  • graphics.InterpolationMode2つのエンドポイント間の中間値を計算する方法を決定します
  • graphics.SmoothingMode線、曲線、塗りつぶされた領域のエッジにスムージング(アンチエイリアシングとも呼ばれる)を使用するかどうかを指定します。おそらくベクターでのみ機能します。
  • graphics.PixelOffsetMode新しいイメージを描画する際のレンダリング品質に影響します

アスペクト比の維持は読者の課題として残されています (実際、それを実行するのがこの関数の役割ではないと思います)。

また、これは良い記事だ画像のサイズ変更の落とし穴をいくつか説明しました。上記の関数でほとんどの問題はカバーできますが、それでも心配しなければならないことがあります。節約

おすすめ記事