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

解决方案 »

  1.   

    用GDI+,DrawImage就可以绘制给定区域内的图片
    可以参考我的blog:stg609.cnblogs.com
      

  2.   

    回复:
    帐号:stg609
    昵称:To   be   is   to   win你好:
       对于这个问题:如何获取一张图片的一部分????比如说我用一个矩形框住图片的一部分,而我所需要的就是框住的那部分???请问大家这如何实现????
       能给点可以执行的代码吗?(即C#的代码)整个文件..
       因为关于图片处理这一块学生真的是不太懂.
       能否发送一个可以运行的整个应用程序代码过来吗??
       请发送至:[email protected]
       谢谢!!!
      

  3.   

    截图程序部分代码(删除了部分对你没用的)  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);//将图片保存到剪贴板
                        ...
                    }
                }
            }
        }你可以直接去我的博客看,至于整个运行程序,因为这些代码是我一个软件中的部分功能代码,没有单独为截图做一个应用程序,所以无法提供.
    好好看下我的那篇文章,应该可以做出来的,嘿嘿.当然写的不当之处,还希望多提意见.
      

  4.   

    其中的CatchRect就是你的那个用于选取的矩形框
      

  5.   

    回复: 
    帐号:stg609 
    昵称:To   be   is   to   win 你好:       我要实现的功能是:当WinForm窗体一开始加载的时候,其上(即窗体中的PictureBox控件)的一个PictureBox1控件就出现一个自定义大小的矩形框,当鼠标进入到PictureBox1中时,这个矩形框就随鼠标移动(即矩形可以随鼠标移动而移动),当鼠标双击时矩形框内的图片被显示到另一个PictureBox2中来,请问这怎么实现???
          麻烦您了!!!希望您能为我解答一下!!!
         非常感谢您的支持!!!!
          
      

  6.   

    刚加载时,绘图是无效的,只能在加载后的paint事件中,才能进行绘图.你可以在窗体的paint事件中加入绘制矩形的代码.
    其中事件手写下:
    Grahpics g = this.picturebox1.CreateGraphics();
    g.drawRectangle(....)另外,你指的矩形随鼠标移动,是指整个矩形随鼠标移动还是类似那种截图的效果?
    1.如果是截图那种效果,你先要设一个全局变量记录固定点的坐标.然后在鼠标的Move事件中添加绘制矩形的代码.
    但是这样会产生很多不必要的矩形.要少消除这些不必要的矩形,一两句话写不完.引用我博客中的一段话:
    我想对于初学者来说如何消去第一次绘制的图片是个比较困难的问题.如果没有采取措施,你会发现只要你鼠标移动,就会画一个矩形,这样便会出现N多的矩形,而我们只是要最后的那一个.
      一般解决这种问题的方法有两种:
      1.就是在绘制第二个图形时,我们先用与底色相同的颜色将上次绘制的图形重新绘制一下.但这往往需要底色为纯色时使用.
      2.我们并不直接将图形画在画板上,我们用一个图片A来保存原画板上的图片.然后再新建一个与图片A相同的图片B,将我们要绘制的图形画在该图片B上,然后再将该图片B画在画板上.这样图片A并没有被改变.于是第二次画的时候我们还是同样新建一个与图片A相同的图片进行绘制.那么上一次的图形就不会被保留下来.问题也就解决了.2.如果矩形大小固定的话,我现在只想到一个比较笨的办法,没有什么好的思路,大家有好的想法的话,可以一起讨论下.
    将整个矩形也就Rectangle变量设为全局变量,然后就是在每次鼠标移动过程中,在鼠标当前位置将矩形重画一遍.
      

  7.   

    Private Declare Function BitBlt Lib "GDI32" (ByVal srchDC As Integer, ByVal srcX As Integer, ByVal srcY As Integer, ByVal srcW As Integer, ByVal srcH As Integer, ByVal desthDC As Integer, ByVal destX As Integer, ByVal destY As Integer, ByVal op As Integer) As Integer
        Private Declare Function CreateCompatibleBitmap Lib "GDI32" (ByVal hDC As Integer, ByVal nWidth As Integer, ByVal nHeight As Integer) As Integer
        Private Declare Function SelectObject Lib "GDI32" (ByVal hDC As Integer, ByVal hObject As Integer) As Integer
        Private Declare Function CreateCompatibleDC Lib "GDI32" (ByVal hDC As Integer) As Integer
        Private Declare Function DeleteDC Lib "GDI32" (ByVal hDC As Integer) As Integer
        Private Declare Function DeleteObject Lib "GDI32" (ByVal hObj As Integer) As Integer
        Declare Function GetDC Lib "user32" Alias "GetDC" (ByVal hwnd As Integer) As Integer
        Const SRCCOPY As Integer = &HCC0020 Try
                Dim hDC, hMDC As Integer
                Dim hBMP, hBMPOld As Integer
                Dim sw, sh As Integer
                hDC = GetDC(0)
                hMDC = CreateCompatibleDC(hDC)
                sw = Screen.PrimaryScreen.Bounds.Width
                sh = Screen.PrimaryScreen.WorkingArea.Height
                hBMP = CreateCompatibleBitmap(hDC, sw, sh)
                hBMPOld = SelectObject(hMDC, hBMP)
                BitBlt(hMDC, 0, 0, sw, sh, hDC, 0, 0, SRCCOPY)
                hBMP = SelectObject(hMDC, hBMPOld)
                PictureBox1.Image = Image.FromHbitmap(New IntPtr(hBMP))
                DeleteDC(hDC)
                DeleteDC(hMDC)
                DeleteObject(hBMP)
                Me.PrintDocument1.Print()
            Catch ex As Exception
                MessageBox.Show(ex.Message, "信息提示", MessageBoxButtons.OK, MessageBoxIcon.Information)
            End Try调整BitBlt中的x,y来获得你需要的图片位置和大小
      

  8.   

    友情UP MARK
      

  9.   

    回复:  
    帐号:stg609  
    昵称:To   be   is   to   win  你好:  
        我所说的就是整个矩形随鼠标移动的(矩形大小固定).不管鼠标怎么移动(即矩形的移动),只能限制在PictureBox1控件内的.当鼠标双击时,矩形框内的图片就显示在另一个PictrueBox 控件内.
        请问这怎么实现???     麻烦您为我解答一下!!谢谢啦!!
      

  10.   


    大家好:
           请问有知道以下功能怎么实现在不:
         
    在windows应用程序中,WinForm里有一个Pictue1控件,此控件上方有一个矩形,现在要做的功能是:整个矩形随鼠标移动的(矩形大小固定).不管鼠标怎么移动(即矩形的移动),只能限制在PictureBox1控件内的.当鼠标双击时,矩形框内的图片就显示在另一个PictrueBox2 控件内. 
        请问这怎么实现???      麻烦各位为我解答一下!!谢谢啦!!
         可以的话把代码贴出来!!!
      

  11.   

    大家好: 
           请问有知道以下功能怎么实现在不: 
          
    在windows应用程序中,WinForm里有一个Pictue1控件,此控件上方有一个矩形,现在要做的功能是:整个矩形随鼠标移动的(矩形大小固定).不管鼠标怎么移动(即矩形的移动),只能限制在PictureBox1控件内的.当鼠标双击时,矩形框内的图片就显示在另一个PictrueBox2 控件内.  
        请问这怎么实现???       麻烦各位为我解答一下!!谢谢啦!! 
         可以的话把代码贴出来!!!
    效果像这样的:
      

  12.   

    看不见你的图片,大概写了下,你自己改改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();
            }    }
    }工程文件已经发到你邮箱
      

  13.   

    回复: 
    帐号:stg609
    昵称:To   be   is   to   win 
     谢谢您!!!
      

  14.   

    回复:  
    帐号:stg609 
    昵称:To   be   is   to   win 
         
          真的很感谢您!!!!!