c# Bitmap类和图像剪贴板功能

发布时间:2017-09-28编辑:佚名阅读(2868)

5.1图像剪贴板功能

Windows中的许多程序都支持剪贴板功能。通过剪贴板可以完成显示数据的剪贴(Cut),复制(Copy),粘贴(Paste)等功能。剪贴板可以理解为一块存储数据的公共区域,用户可以用菜单项复制(Copy)或剪贴(Cut)把数据放入到剪贴板中,当本任务或其它任务要用剪贴板中的数据时,可以用菜单项粘贴(Paste)从剪贴板中把数据取出。存入剪贴板中的数据,可以是字符,位图,或者其它格式数据。在图形模式下使用剪贴板包括如下动作:选定剪贴区域、剪贴(Cut)、复制(Copy)、粘贴(Paste)等。使过画图程序的读者都知道,在使用剪贴和复制前,必须首先选定剪贴或复制区域,首先按一个按钮,通知程序要选定剪贴或复制区域,然后在要选定区域的左上角按下鼠标左键,拖动鼠标画出一个矩形,抬起鼠标后显示一个矩形既为要选定剪贴或复制区域。剪贴或复制后,矩形自动消失。下面详细介绍实现以上功能的方法。

5.12.1剪贴区域选定

剪贴区域选定的方法和前边章节中拖动鼠标方法绘制椭圆或圆的方法基本一样,只是在这里绘制的是矩形,而且在鼠标抬起时,不把矩形存入PictureBox控件属性Image引用的位图对象中,仅仅记录矩形的位置。请读者自己实现此功能。

5.12.2剪贴板复制功能的实现

假定已选定剪贴区域,例如为区域Rectangle(10,10,50,50),把此区域的图形或图像放到剪贴板中。具体实现步骤如下:
(1)新建项目。放PictureBox控件到窗体,修改属性Dock=Fill。属性Name=pictureBox1,修改属性Image,使其显示一幅图。
(2)把Mainmenu控件放到主窗体中。增加顶级菜单项:编辑,属性Name=menuItemEdit。为编辑弹出菜单增加菜单项:复制、剪贴、粘贴。属性Name分别为menuItemCopy、menuItemCut、menuItemPaste。
(3)为窗体菜单项复制增加单击事件函数如下:

private void menuItemCopy_Click(object sender, System.EventArgs e)
{
    Bitmap myBitmap=new Bitmap(pictureBox1.Image);
    Rectangle cloneRect=new Rectangle(10,10,50,50);
    System.Drawing.Imaging.PixelFormat format=myBitmap.PixelFormat;
    Bitmap cloneBitmap=myBitmap.Clone(cloneRect,format);
    Clipboard.SetDataObject(cloneBitmap);
}


(4)运行,选中复制菜单项,复制图形到剪贴板。打开画图程序,选中画图程序粘贴菜单项,可以看到被复制的图形能正确粘贴到画图程序中。

5.12.3剪贴板剪贴功能的实现

(5)剪贴是先复制,再把选中区域图形清除,菜单项剪贴单击事件处理函数如下:

private void menuItemCut_Click(object sender,System.EventArgs e)
{
    menuItemCopy_Click(sender,e);//调用复制菜单项单击事件处理函数
    Bitmap bits=new Bitmap(50,50);//建立位图对象,宽和高为选中区域大小
    Graphics g=Graphics.FromImage(bits);//得到位图对象的Graphics类的对象
    g.Clear(Color.White);//用白色清除位图对象中的图像
    Bitmap myBitmap=new Bitmap(pictureBox1.Image);
    g=Graphics.FromImage(myBitmap);
    g.DrawImage(bits,10,10,50,50);
    pictureBox1.Image=myBitmap;//位图对象在pictureBox1中显示,即清除
}


(6)运行,选中剪贴菜单项,拷贝图形到剪贴板,原位置图形被清空为白色,最小化后再最大化,图形不变。打开画图程序,选中画图程序粘贴菜单项,可以看到被拷贝的图形能正确粘贴到画图程序中。

5.12.4剪贴板粘贴功能的实现

(7)为窗体菜单项粘贴增加单击事件函数如下:

private void menuItemPaste_Click(object sender, System.EventArgs e)
{
    IDataObject iData=Clipboard.GetDataObject();//得到剪贴板对象
    if(iData.GetDataPresent(DataFormats.Bitmap))//判断剪贴板有无位图对象
    {
        Bitmap bits=(Bitmap)iData.GetData(DataFormats.Bitmap);//得到剪贴板位图
        Bitmap myBitmap=new Bitmap(pictureBox1.Image);
        Graphics g=Graphics.FromImage(myBitmap);
        g.DrawImage(bits,30,30);
        pictureBox1.Image=myBitmap;//位图对象在pictureBox1中显示
    }
}


(8)运行画图程序,选中拷贝菜单项,拷贝图形到剪贴板。运行自己编制的程序,选中粘贴菜单项,可以看到画图程序中被拷贝的图形能正确粘贴到自己编制的程序中。
(9)画图程序粘贴后,能用鼠标移动粘贴的图形,现实现此功能。放PictureBox控件到窗体,属性Name=pictureBox2,属性Visable=false。这里把粘贴后的图形放到PictureBox2中,使其可以移动。为Form1类增加变量:bool mark=false;int x=0,y=0;为pictureBox2控件的事件OnMouseDown,OnMouseUp,OnMouseMove增加事件函数如下:

private void pictureBox2_MouseDown(object sender,System.Windows.Forms.MouseEventArgs e)
{
    mark=true;
    x=e.X;
    y=e.Y;
}
private void pictureBox2_MouseMove(object sender,System.Windows.Forms.MouseEventArgs e)
{
    if(mark)
    {
        int x1,y1;
        x1=e.X-x;
        y1=e.Y-y;
        pictureBox1.Invalidate();//擦除上次鼠标移动时画的图形
        pictureBox1.Update();//立即重画,即擦除
        pictureBox2.Left+=x1;
        pictureBox2.Top+=y1;
        x=e.X;//原来没有此2句
        y=e.Y;
    }
}
private void pictureBox2_MouseUp(object sender,System.Windows.Forms.MouseEventArgs e)
{
    mark=false;
}


(10)修改窗体菜单项粘贴单击事件函数如下:

private void menuItemPaste_Click(object sender,System.EventArgs e)
{
    IDataObject iData=Clipboard.GetDataObject();
    if(iData.GetDataPresent(DataFormats.Bitmap))
    {
        Bitmap bit=(Bitmap)iData.GetData(DataFormats.Bitmap);
        pictureBox2.Width=bit.Width;//阴影为修改部分
        pictureBox2.Height=bit.Height;
        pictureBox2.Image=bit;
        pictureBox2.Top=pictureBox1.Top;
        pictureBox2.Left=pictureBox1.Left;
        pictureBox2.Parent=pictureBox1;
        pictureBox2.Visible=true;
    }
}


(11)在pictureBox1控件任意位置单击鼠标,表示已将粘贴图像拖到指定位置,需将粘贴图像粘贴到pictureBox1控件。为pictureBox1控件的事件OnMouseDown增加事件函数如下:

private void pictureBox1_MouseDown(object sender,System.Windows.Forms.MouseEventArgs e)
{
    if(pictureBox2.Image!=null && pictureBox2.Visible)
    {
        Bitmap bits=new Bitmap(pictureBox2.Image);
        Bitmap myBitmap = new Bitmap(pictureBox1.Image);
        Graphics g=Graphics.FromImage(myBitmap);
        g.DrawImage(bits,pictureBox2.Left,pictureBox2.Top);
        pictureBox1.Image=myBitmap;//位图对象在pictureBox1中显示
        pictureBox2.Visible=false;
    }
}


(12)运行画图程序,选中拷贝菜单项,拷贝图形到剪贴板。运行自己编制的程序,选中粘贴菜单项,可以看到画图程序中被拷贝的图形能正确粘贴到自己编制的程序中。拖动被拷贝的图形,使其运动到指定位置,在pictureBox2外,单击鼠标右键,图形固定到指定位置。


    关键字: c# Bitmap类 图像剪贴板功能


鼓掌

1

正能量

0

0

呵呵

0


评论区