裁剪具有不同屏幕分辨率的图像

时间:2012-11-20 17:54:53

标签: c# .net

我需要的是在同一个地方裁剪图像,但分辨率不同。

例如:

使用1024 x 768

创建的图像1

使用1440 x 900

创建的图像2

现在我必须裁剪图像,但在同一个地方让我们说它将是

X = 10% Y = 10% 宽度= 30% 高度= 20%

我使用以下代码来执行此操作,但它不能像我需要的那样工作。

有任何线索吗?

谢谢!!!

int x = 0;
int y = 0;
int w = 0;
int h = 0;

int inputX = 10;
int inputY = 10;
int inputW = 20;
int inputH = 30;

x = int.Parse(Math.Round(decimal.Parse((__Bitmap.Width * inputX / 100).ToString()), 0).ToString());
y = int.Parse(Math.Round(decimal.Parse((__Bitmap.Height * inputY / 100).ToString()), 0).ToString());

w = int.Parse(Math.Round(decimal.Parse((__Bitmap.Width * inputW / 100).ToString()), 0).ToString());
h = int.Parse(Math.Round(decimal.Parse((__Bitmap.Height * inputH / 100).ToString()), 0).ToString());

Rectangle cropArea = new Rectangle(x, y, w,h);
Bitmap bmpCrop = __Bitmap.Clone(cropArea, __Bitmap.PixelFormat);

我的意思是,如果有技术逻辑吗?

我想我可以做(伪代码)

if (Resolution == "1024x768")
    int inputX = 10;
    int inputY = 10;
    int inputW = 20;
    int inputH = 30;
else if (Resolution == "1440x900")
    int inputX = 8;
    int inputY = 8;
    int inputW = 19;
    int inputH = 28;

 and etc...

我不确定是否有任何系数可以根据分辨率重新计算%...这就像crop-factor

更新:

enter image description here

2 个答案:

答案 0 :(得分:2)

一个快速而肮脏的例子,我的意思是,当你用百分比计算你的裁剪窗口时,你总会得到相同的图像部分:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        // 100x80 image
        Image asdf = Image.FromFile("asdf.bmp", true);

        // twice the size, 200x160
        Image asdf2 = Image.FromFile("asdf2.bmp", true);

        // same image, different aspect ratio: 200x80
        Image asdf3 = Image.FromFile("asdf3.bmp", true);

        Bitmap asdfBmp = new Bitmap(asdf);
        Bitmap asdf2Bmp = new Bitmap(asdf2);
        Bitmap asdf3Bmp = new Bitmap(asdf3);

        pictureBox1.Image = cropImage(asdfBmp);
        pictureBox2.Image = cropImage(asdf2Bmp);
        pictureBox3.Image = cropImage(asdf3Bmp);
    }

    private Bitmap cropImage(Bitmap sourceBitmap)
    {
        double x = 0;
        double y = 0;
        double w = 0;
        double h = 0;

        double inputX = 10;
        double inputY = 10;
        double inputW = 50;
        double inputH = 50;

        // integer division " 10 / 100 " will return 0, use doubles or floats.
        // furthermore you don't have to convert anything to a string or back here.
        x = sourceBitmap.Width * inputX / 100.0;
        y = sourceBitmap.Height * inputY / 100.0;

        w = sourceBitmap.Width * inputW / 100.0;
        h = sourceBitmap.Height * inputH / 100.0;

        // casting to int will just cut off all decimal places. you could also round.
        Rectangle cropArea = new Rectangle((int)x, (int)y, (int)w, (int)h);
        return sourceBitmap.Clone(cropArea, sourceBitmap.PixelFormat);
    }
}

来源:

asdf.bmp asdf2.bmp asdf3.bmp

结果:

Result

如您所见,所有结果图像都显示图像的相同部分。所以我要么仍然没有得到你的目标,要么你的错误必须在其他地方。

考虑到您不必要的类型转换和整数除法错误,您或许应该看一下c# tutorial about types

答案 1 :(得分:1)

首先计算作物的中心。我假设你得到了所需的x,y,w,h值。然后需要将该中心点重新计算到第二个图像的中心:即如果中心是[25; 50],则对于1024x768图像,它分别为[25/1024; 50/768],得到[2.44%] ; 6.51%]。所以在第二张图片上,让我们说1440x900它给了我们[1440 * 2.44%; 900 * 6.51%] => [35; 59]当然是像素。

现在您需要新图像的宽度和高度。如果宽高比相同则很容易,因为您可以将尺寸计算为cropWidth/firstImageWidth*secondImageWidth,但是您需要将其乘以正确的宽高比。

无论如何,我认为你不明白这个问题。如果相似图像的纵横比不同,则图像的不同部分或图像失真。

下面我更正了你的例子。我不会解释它,因为它很明显..我希望。只需看看透明的黑色和白色区域覆盖的部分......

enter image description here