C#:GDI +图像裁剪

时间:2009-06-23 01:55:04

标签: c# gdi+

我有一张图片。我想从左边裁剪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像素的图像和一个调整大小的图像。而不是裁剪它调整宽度我认为。所以图像缩小(按宽度)。任何人都可以纠正我吗?提前致谢

5 个答案:

答案 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)

科里罗斯是对的。或者,您可以沿负x轴平移并渲染0.0,0.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);
    }
    //...