我的工作很艰难,无法解决所有纵横比大于4:3到4:3的图像。

例如,我可能要调整一些尺寸为16:9的图像,然后将其裁切为4:3。

我已经可以使用调整大小位,但是它保持了相同的宽高比。我知道我需要使用Graphics.DrawImage(),但是我不完全确定参数应该是什么,也不知道如何得出这些参数。

这是我所知道的:

var dimension = (double)bigSide/smallSide
if(dimension > 1.4)
{
  Graphics.DrawImage(resImage, new Rectangle(?, ?, ?, ?), ?, ?, ?, ?, GraphicsUnit.Pixel);
}


因此所有这些问号都是我不了解的参数。我也不确定将图像缩减为4:3时需要什么样的数学运算。

本质上,我只想剪切比4:3宽的图像的边(居中)。显然,我会剪切图像的顶部和底部,该图像是纵向而不是横向。

任何帮助将不胜感激。

TIA

最佳答案

我看到您评论过,您还想将裁剪后的图像调整为较小的尺寸,对吗?

Image resizeImg(Image img, int width)
    {
        // 4:3 Aspect Ratio. You can also add it as parameters
        double aspectRatio_X = 4;
        double aspectRatio_Y = 3;
        double targetHeight = Convert.ToDouble(width) / (aspectRatio_X / aspectRatio_Y);

        img = cropImg(img);
        Bitmap bmp = new Bitmap(width, (int)targetHeight);
        Graphics grp = Graphics.FromImage(bmp);
        grp.DrawImage(img, new Rectangle(0, 0, bmp.Width, bmp.Height), new Rectangle(0, 0, img.Width, img.Height), GraphicsUnit.Pixel);
        return (Image)bmp;

    }

    Image cropImg(Image img)
    {
        // 4:3 Aspect Ratio. You can also add it as parameters
        double aspectRatio_X = 4;
        double aspectRatio_Y = 3;

        double imgWidth = Convert.ToDouble(img.Width);
        double imgHeight = Convert.ToDouble(img.Height);

        if (imgWidth / imgHeight > (aspectRatio_X / aspectRatio_Y))
        {
            double extraWidth = imgWidth - (imgHeight * (aspectRatio_X / aspectRatio_Y));
            double cropStartFrom = extraWidth / 2;
            Bitmap bmp = new Bitmap((int)(img.Width - extraWidth), img.Height);
            Graphics grp = Graphics.FromImage(bmp);
            grp.DrawImage(img, new Rectangle(0, 0, (int)(img.Width - extraWidth), img.Height), new Rectangle((int)cropStartFrom, 0, (int)(imgWidth - extraWidth), img.Height), GraphicsUnit.Pixel);
            return (Image)bmp;
        }
        else
            return null;
    }

    private void button1_Click(object sender, EventArgs e)
    {
        pictureBox2.Image = resizeImg(pictureBox1.Image, 60);
    }


使用调整大小方法并提供宽度作为参数。不需要增加高度,因为它是通过裁剪方法完成的。

关于c# - 将图片裁剪为4:3的宽高比C#,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18494403/

10-10 02:06