2009-06-23 253 views
1

我有一个形象。我想从左边和从image.I的右10px的用下面的代码这样做C#:GDI +图片裁剪

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像素但这不是给我我期望的结果。这将输出一个图像,它具有从右边裁剪10像素和调整大小的图像。替代裁剪,它将调整我认为的宽度。因此图像会缩小(按宽度)。任何人都可以纠正我吗?在此先感谢

+1

以哪种方式不会给您预期的结果?你在看什么? – Chris 2009-06-23 01:57:21

回答

1

您的新宽度应该减少两倍的作物边际,因为您会从两边削减该数量。

接下来,将图像绘制为新图像时,以负偏移量绘制图像。这会导致您不感兴趣的区域被裁剪掉。

int cropX = 10; 
Bitmap target = new Bitmap(myOriginalImage.Width - 2*cropX, myOriginalImage.Height); 
using (Graphics g = Graphics.FromImage(target)) 
{ 
    g.DrawImage(myOriginalImage, -cropX, 0); 
} 
+0

感谢科里这工作 – Shyju 2009-06-23 02:17:46

0

好吧,我完全无法解释在这一点,但挂在:

的drawImage方法要求图像的位置,以及它的位置。您需要第二个位置进行裁剪,因为旧的方式与新方式有关,反之亦然。

这完全是不可理解的,但这里是代码。

g.DrawImage(myOriginalImage, -cropArea.X, -cropArea.Y); 

我希望能解释它,然后我做了。

0

我的猜测是此行

Rectangle cropArea = new Rectangle(10,0, newWidth-10, newHeight); 

应该是

Rectangle cropArea = new Rectangle(10,0, newWidth-20, newHeight); 

设置新矩形的宽度为比原来少20 - 10每一侧上。

有些迹象表明它给你的结果会有助于确认这一点。

+0

我正在调整一个调整大小的图像(缩小宽度) – Shyju 2009-06-23 02:03:00

+0

是的,但结果是意外的,因为它只能从左侧切下10px?如果是这样,那么我指出的改变应该解决我认为的问题。 – Tetraneutron 2009-06-23 02:06:06

0

科里罗斯是正确的。或者,您可以沿负x轴平移并渲染为0.0,0.0。应该产生相同的结果。

using (Graphics g = Graphics.FromImage(target)) 
{ 
    g.TranslateTransform(-cropX, 0.0f); 
    g.DrawImage(myOriginalImage, 0.0f, 0.0f); 
} 
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); 
    } 
    //...