日期:2014-05-17  浏览次数:20922 次

DrawImage的用法。。。
clean_bmp是一个大图像,我想要截取里面的一个小矩形,之后保存为图像。

Bitmap bmp = new Bitmap(r - l, b - t);
Rectangle bmp_rect = new Rectangle(0, 0, r - l, b - t);
Graphics g = Graphics.FromImage(clean_bmp);
g.DrawImage(bmp, bmp_rect, l, t, r - l, b - t, GraphicsUnit.Pixel);
bmp.Save(offline_save_path + "\\" + textBox1.Text + ".tif");

但是保存后的文件大小是对的,不过确实一片黑,请问我哪里写错了?
谢谢~!

------解决方案--------------------
g.DrawImage(bmp, bmp_rect, l, t, r - l, b - t, GraphicsUnit.Pixel);
这个bmp不是你新建的空白画布吗?当然是空的默认一片黑了.实际上这个参数是源图,而不是目标图.
g.DrawImage(源图,目标图的哪个矩形,从源图中哪个矩形,模式)
此处源图为你要绘制的图,目标图为你新建的空白画布.
------解决方案--------------------
关注中……………………
------解决方案--------------------
1楼正解
------解决方案--------------------
探讨

g.DrawImage(bmp, bmp_rect, l, t, r - l, b - t, GraphicsUnit.Pixel);
这个bmp不是你新建的空白画布吗?当然是空的默认一片黑了.实际上这个参数是源图,而不是目标图.
g.DrawImage(源图,目标图的哪个矩形,从源图中哪个矩形,模式)
此处源图为你要绘制的图,目标图为你新建的空白画布.

------解决方案--------------------
C# code
/// <summary>
/// 剪裁 -- 用GDI+
/// </summary>
/// <param name="b">原始Bitmap</param>
/// <param name="StartX">开始坐标X</param>
/// <param name="StartY">开始坐标Y</param>
/// <param name="iWidth">宽度</param>
/// <param name="iHeight">高度</param>
/// <returns>剪裁后的Bitmap</returns>
public static Bitmap CutOut(Bitmap b, int StartX, int StartY, int iWidth, int iHeight)
{
    if (b == null)
    {
        return null;
    }

    int w = b.Width;
    int h = b.Height;

    if (StartX >= w || StartY >= h)
    {
        return null;
    }

    if (StartX + iWidth > w)
    {
        iWidth = w - StartX;
    }

    if (StartY + iHeight > h)
    {
        iHeight = h - StartY;
    }

    try
    {
        Bitmap bmpOut = new Bitmap(iWidth, iHeight, System.Drawing.Imaging.PixelFormat.Format24bppRgb);

        Graphics g = Graphics.FromImage(bmpOut);
        g.DrawImage(b, new Rectangle(0, 0, iWidth, iHeight), new Rectangle(StartX, StartY, iWidth, iHeight), GraphicsUnit.Pixel);
        g.Dispose();

        return bmpOut;
    }
    catch
    {
        return null;
    }
}

private void button1_Click(object sender, EventArgs e)
{
    Image clean_bmp = this.pictureBox1.Image;
    int r = 200;
    int l = 100;
    int b = 200;
    int t = 100;

    Bitmap bmp = CutOut(new Bitmap(clean_bmp), l, t, r, t);
    bmp.Save(@"D:\a.tif");
}

------解决方案--------------------
探讨
g.DrawImage(bmp, bmp_rect, l, t, r - l, b - t, GraphicsUnit.Pixel);
这个bmp不是你新建的空白画布吗?当然是空的默认一片黑了.实际上这个参数是源图,而不是目标图.
g.DrawImage(源图,目标图的哪个矩形,从源图中哪个矩形,模式)
此处源图为你要绘制的图,目标图为你新建的空白画布.