我需要的是在同一个地方裁剪图像,但分辨率不同。
例如:
使用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。
更新:
答案 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);
}
}
来源:
结果:
如您所见,所有结果图像都显示图像的相同部分。所以我要么仍然没有得到你的目标,要么你的错误必须在其他地方。
考虑到您不必要的类型转换和整数除法错误,您或许应该看一下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
,但是您需要将其乘以正确的宽高比。
无论如何,我认为你不明白这个问题。如果相似图像的纵横比不同,则图像的不同部分或图像失真。
下面我更正了你的例子。我不会解释它,因为它很明显..我希望。只需看看透明的黑色和白色区域覆盖的部分......