0

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

例如:

使用 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

更新:

在此处输入图像描述

4

2 回答 2

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

结果:

结果

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

考虑到您不必要的类型转换和整数除法错误,您或许应该看看有关 types 的 c# 教程

于 2012-11-20T18:40:17.387 回答
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] 当然以像素为单位。

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

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

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

在此处输入图像描述

于 2012-11-21T23:42:02.183 回答