日期:2014-05-18  浏览次数:21009 次

如何获取一张图片的一部分????比如说我用一个矩形框住图片的一部分,而我所需要的就是框住的那部分???请问大家这如何实现????
如何获取一张图片的一部分????比如说我用一个矩形框住图片的一部分,而我所需要的就是框住的那部分???请问大家这如何实现????

------解决方案--------------------
用GDI+,DrawImage就可以绘制给定区域内的图片
可以参考我的blog:stg609.cnblogs.com
------解决方案--------------------
截图程序部分代码(删除了部分对你没用的)
C# code

  private void Catch_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            if (e.Button == MouseButtons.Left)
            {
                if (CatchRect.Contains(new Point(e.X, e.Y)))
                {//如果鼠标是在所要截取的矩形区域内则执行
                    Bitmap CatchedBmp = new Bitmap(CatchRect.Width, CatchRect.Height);//新建一个于矩形等大的空白图片
                    Graphics g = Graphics.FromImage(CatchedBmp);
                    g.DrawImage(originBmp, new Rectangle(0, 0, CatchRect.Width, CatchRect.Height), CatchRect, GraphicsUnit.Pixel);
                    //把orginBmp中的指定部分按照指定大小画在画板上
                    Clipboard.SetImage(CatchedBmp);//将图片保存到剪贴板
                    ...
                }
            }
        }
    }

------解决方案--------------------
刚加载时,绘图是无效的,只能在加载后的paint事件中,才能进行绘图.你可以在窗体的paint事件中加入绘制矩形的代码.
其中事件手写下:
Grahpics g = this.picturebox1.CreateGraphics();
g.drawRectangle(....)

另外,你指的矩形随鼠标移动,是指整个矩形随鼠标移动还是类似那种截图的效果?
1.如果是截图那种效果,你先要设一个全局变量记录固定点的坐标.然后在鼠标的Move事件中添加绘制矩形的代码.
但是这样会产生很多不必要的矩形.要少消除这些不必要的矩形,一两句话写不完.

引用我博客中的一段话:
我想对于初学者来说如何消去第一次绘制的图片是个比较困难的问题.如果没有采取措施,你会发现只要你鼠标移动,就会画一个矩形,这样便会出现N多的矩形,而我们只是要最后的那一个.
  一般解决这种问题的方法有两种:
  1.就是在绘制第二个图形时,我们先用与底色相同的颜色将上次绘制的图形重新绘制一下.但这往往需要底色为纯色时使用.
  2.我们并不直接将图形画在画板上,我们用一个图片A来保存原画板上的图片.然后再新建一个与图片A相同的图片B,将我们要绘制的图形画在该图片B上,然后再将该图片B画在画板上.这样图片A并没有被改变.于是第二次画的时候我们还是同样新建一个与图片A相同的图片进行绘制.那么上一次的图形就不会被保留下来.问题也就解决了.

2.如果矩形大小固定的话,我现在只想到一个比较笨的办法,没有什么好的思路,大家有好的想法的话,可以一起讨论下.
将整个矩形也就Rectangle变量设为全局变量,然后就是在每次鼠标移动过程中,在鼠标当前位置将矩形重画一遍.
------解决方案--------------------
看不见你的图片,大概写了下,你自己改改
C# code

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace test
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private Rectangle rect;

        private void pictureBox1_Paint(object sender, PaintEventArgs e)
        {

            Graphics g = e.Graphics;
            rect = new Rectangle(0, 0, 100, 100);
            g.DrawRectangle(new Pen(Color.White, 1), rect);

        }

        private void pictureBox1_MouseMove(object sender, MouseEventArgs e)
        {
            Bitmap bmp = (Bitmap)this.pborginalimg.Image.Clone();
            Graphics g = Graphics.FromImage(bmp);
            rect.Location = e.Location;
            g.DrawRectangle(new Pen(Color.White, 1), rect);
            g.Dispose();
            g = this.pborginalimg.CreateGraphics();
            g.DrawImage(bmp, 0, 0);
            g.Dispose();
            bmp.Dispose();

        }

        private void pictureBox1_MouseDoubleClick(object sender, MouseEventArgs e)
        {
            Graphics g = this.pbdestimg.CreateGraphics();
            g.DrawImage(pborginalimg.Image, 0, 0, rect, GraphicsUnit.Pixel);
            g.Dispose();
        }

    }
}