我有一张图片。我想从左边裁剪10像素,从右边裁剪10像素。我使用下面的代码来做到这一点
string oldImagePath="D:\\RD\\dotnet\\Images\\photo1.jpg";
Bitmap myOriginalImage = (Bitmap)Bitmap.FromFile(oldImagePath);
int newWidth = myOriginalImage.Width;
int newHeight = myOriginalImage.Height;
Rectangle cropArea = new Rectangle(10,0, newWidth-10, newHeight);
Bitmap target = new Bitmap(cropArea.Width, cropArea.Height);
using (Graphics g = Graphics.FromImage(target))
{
g.DrawImage(myOriginalImage,cropArea);
}
target.Save("D:\\RD\\dotnet\\Images\\test.jpg");
但这并没有给我我期望的结果。这将输出一个从右边裁剪10像素的图像和一个调整大小的图像。而不是裁剪它调整宽度我认为。所以图像缩小(按宽度)。任何人都可以纠正我吗?提前致谢
答案 0 :(得分:2)
你的新宽度应减少两倍的裁剪余量,因为你将从两边切掉这个数量。
接下来,在将图像绘制到新图像时,以负偏移绘制它。这会导致您不感兴趣的区域被剪掉。
int cropX = 10;
Bitmap target = new Bitmap(myOriginalImage.Width - 2*cropX, myOriginalImage.Height);
using (Graphics g = Graphics.FromImage(target))
{
g.DrawImage(myOriginalImage, -cropX, 0);
}
答案 1 :(得分:0)
好吧,我完全没有解释这个,但坚持:
DrawImage函数需要图像的位置及其位置。你需要第二个位置进行裁剪,因为旧的与旧的相关,反之亦然。
这完全是不可理解的,但这是代码。
g.DrawImage(myOriginalImage, -cropArea.X, -cropArea.Y);
我希望这能解释得更多。
答案 2 :(得分:0)
我的猜测是这一行
Rectangle cropArea = new Rectangle(10,0, newWidth-10, newHeight);
应该是
Rectangle cropArea = new Rectangle(10,0, newWidth-20, newHeight);
将新矩形的宽度设置为比原始矩形小20 - 每边10个。
有些迹象表明它给你的结果将有助于确认这一点。
答案 3 :(得分:0)
using (Graphics g = Graphics.FromImage(target))
{
g.TranslateTransform(-cropX, 0.0f);
g.DrawImage(myOriginalImage, 0.0f, 0.0f);
}
答案 4 :(得分:0)
您需要使用已指定Destination Rectangle和Source Rectangle的重载。
以下是使用表单上的图片框的交互式表单。它允许您拖动图像。我建议将图片框设置为100 x 100并使用更大的图像,例如使用alt-prtscr捕获的全屏窗口。
class Form1 : Form
{
// ...
Image i = new Bitmap(@"C:\Users\jasond\Pictures\foo.bmp");
Point lastLocation = Point.Empty;
Size delta = Size.Empty;
Point drawLocation = Point.Empty;
bool dragging = false;
private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Left)
{
if (!dragging)
{
lastLocation = e.Location;
dragging = true;
}
delta = new Size(lastLocation.X - e.Location.X, lastLocation.Y - e.Location.Y);
lastLocation = e.Location;
if (!delta.IsEmpty)
{
drawLocation.X += delta.Width;
drawLocation.Y += delta.Height;
pictureBox1.Invalidate();
}
}
else
{
dragging = false;
}
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Rectangle source = new Rectangle(drawLocation,pictureBox1.ClientRectangle.Size);
e.Graphics.DrawImage(i,pictureBox1.ClientRectangle,source, GraphicsUnit.Pixel);
}
//...