crop image to 4:3 aspect ratio c#
我很难在脑子里盘算如何裁剪高纵横比4:3到4:3的图像。
例如,我可能有一些16:9的图像需要调整大小,然后裁剪为4:3。
调整大小的位我已经有工作,但它保持相同的纵横比。我知道我需要使用
我知道的是:
1 2 3 4 5 | var dimension = (double)bigSide/smallSide if(dimension > 1.4) { Graphics.DrawImage(resImage, new Rectangle(?, ?, ?, ?), ?, ?, ?, ?, GraphicsUnit.Pixel); } |
所以所有这些问号都是我不理解的参数。我也不确定将图像缩小到4:3需要什么样的数学效果。
本质上,我只想剪掉一个比4:3宽的图像(中间)的边。很明显,我会把图像的顶部和底部剪成肖像而不是风景。
任何帮助都将不胜感激。
蒂亚
我看到你说你还想把裁剪后的图像调整到较小的尺寸,对吗?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | 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); } |
使用"调整大小"方法并提供宽度作为参数。不需要增加高度,因为它是由裁剪方法完成的。
这里有一个裁剪更宽图像的方法,这样你就可以理解这个概念了。
首先计算图像的额外宽度。也就是说,它需要多少额外的空间,而不是4:3的比例。
假设我要将1366 x 768图片裁剪为1024 x 768。
这里我们可以用高度(768px)计算额外的宽度:
1 | 4 / 3 * (768) = 1024 |
所以,这就给出了768高度的目标宽度。
现在额外的宽度是:
1 | 1366 - 1024 |
现在,您可以通过将起始裁剪点放在额外宽度的1/2处来裁剪图像,并选择完整的裁剪高度。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | 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 = cropImg(pictureBox1.Image); } |
答案在这里和这里
1 2 3 |
此代码以所需的纵横比从0.0开始裁剪图像部分。可以根据需要设置X坐标和Y坐标,并根据图像中心进行计算。例如,如果您的图像是1600 x 900,则中心点是800和450,因此要裁剪它的中心。
1 |
这有点简单,但我希望你能理解这一点。