您的位置:程序门 -> vb ->



如何根据颜色值来显示该颜色值区域


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


如何根据颜色值来显示该颜色值区域
发表于:2007-10-20 12:07:34 楼主
各位大侠
        最近编写一个用来取色软件
        用windows图片和传真查看器中显示的图片,根据图片中黑色(#ffffff)来选取以黑色为主的区域(轮廓),将其区域保存在c:\white.bmp下。各位大侠,请问有什么办法可以实现呢?
发表于:2007-10-20 12:48:021楼 得分:0
说一下思路
    你要求的功能是不是qq截图所要实现的功能

是的话   继续向下看
因为近来想写个类似于远程桌面监控的程序,该程序中要用到屏幕捕捉.为实现该程序的一部分功能,做了个小demo.程序很简单,用到的技术也不多,只能实现类似qq的截图功能(方法虽然很笨)
程序流程如下:   字串3  

字串5


1.截取整个屏幕并保存
2.新开一个全屏窗口,将保存的屏幕作为背景
3.鼠标拖动改变截取范围,右键取消
4.双击截取,保存在粘贴板,全屏窗口关闭  

字串3


   

字串4

好了,下面的是代码部分   字串9  

字串5


首先新建一个项目screencutter(vs2005),将窗体名改为mainform,再新建一个窗体screenbody.
添加一个按钮btncutter到screencutter并添加按钮事件:
                private   void   btncutter_click(object   sender,   eventargs   e)
                {
                        image   img   =   new   bitmap(screen.allscreens[0].bounds.width,   screen.allscreens[0].bounds.height);
                        graphics   g   =   graphics.fromimage(img);
                        g.copyfromscreen(new   point(0,   0),   new   point(0,   0),   screen.allscreens[0].bounds.size);
                        screenbody   body   =   new   screenbody();
                        body.backgroundimage   =   img;
                        body.show();  

字串8

                }screen.allscreens[0]是获取当前所有设备窗口的第一个,我这里只有一个显示器,当然我就是第一个.
利用graphics的copyfromscreen函数获取当前屏幕.  
   

字串5


好了,现在按下按钮全屏窗口就会出来了.  

字串1


下面讲全屏窗口screenbody,首先设置窗体的formborderstyle为none,然后声明以下变量
private   graphics   mainpainter;     //主画笔
private   pen   pen;                               //就是笔咯
private   bool   isdowned;                   //判断鼠标是否按下
private   bool   rectready;                   //矩形是否绘制完成
private   image   baseimage;               //基本图形(原来的画面)
private   rectangle   rect;                 //就是要保存的矩形
private   point   downpoint;                 //鼠标按下的点
int   tmpx;                                          
int   tmpy;
之后就是窗体的鼠标函数了,里面很多代码都没有作出整理,看了一下,整理后的代码应该会更少更精简的   字串9  

private   void   screenbody_doubleclick(object   sender,   eventargs   e)
{
        if   (((mouseeventargs)e).button   ==   mousebuttons.left   &&rect.contains(((mouseeventargs)e).x,   ((mouseeventargs)e).y))
        {
                //保存的时候有很多种方法的......我这里只用了这种
                image   memory   =   new   bitmap(rect.width,   rect.height);
                graphics   g   =   graphics.fromimage(memory);
                g.copyfromscreen(rect.x   +   1,   rect.y   +   1,   0,   0,   rect.size);
                clipboard.setimage(memory);
                this.close();
        }
}    

字串6


private   void   screenbody_mousedown(object   sender,   mouseeventargs   e)
{
        if   (e.button   ==   mousebuttons.left)
        {
                isdowned   =   true;
               
                if   (rectready   ==   false)
                {
                        rect.x   =   e.x;
                        rect.y   =   e.y;
                        downpoint   =   new   point(e.x,   e.y);
                }
                if   (rectready   ==   true)
                {
                        tmpx   =   e.x;
                        tmpy   =   e.y;
                }  

字串2

        }
        if   (e.button   ==   mousebuttons.right)
        {
                if   (rectready   !=   true)
                {
                        this.close();
                        return;
                }
                mainpainter.drawimage(baseimage,   0,   0);
                rectready   =   false;
        }  
}  
private   void   screenbody_mouseup(object   sender,   mouseeventargs   e)
{
        if   (e.button   ==   mousebuttons.left)
        {
                isdowned   =   false;
                rectready   =   true;
        }
}   字串3  
private   void   screenbody_mousemove(object   sender,   mouseeventargs   e)   字串8  
{  

字串7

        if   (rectready   ==   false)
        {
                if   (isdowned   ==   true)
                {
                        image   new   =   drawscreen((image)baseimage.clone(),   e.x,   e.y);
                        mainpainter.drawimage(new,   0,   0);
                        new.dispose();
                }
        }
        if   (rectready   ==   true)
        {
                if   (rect.contains(e.x,   e.y))
                {
                        //this.cursor   =   cursors.hand;
                        if   (isdowned   ==   true)
                        {  

字串6


                                //和上一次的位置比较获取偏移量
                                rect.x   =   rect.x   +   e.x   -   tmpx;
                                rect.y   =   rect.y   +   e.y   -   tmpy;
                                //记录现在的位置
                                tmpx   =   e.x;
                                tmpy   =   e.y;
                                moverect((image)baseimage.clone(),   rect);
                        }
                }
        }
       
字串8


}  
private   void   screenbody_load(object   sender,   eventargs   e)
{
        this.windowstate   =   formwindowstate.maximized;
        mainpainter   =   this.creategraphics();
        pen   =   new   pen(brushes.blue);
        isdowned   =   false;
        baseimage   =   this.backgroundimage;
        rect   =   new   rectangle();
        rectready   =   false;
}  

字串6

辅助函数
本来应该写更多的辅助函数的,将窗体响应函数里面的代码放到里面来,不过本人很懒,就这样将就了.呵呵   字串3  

private   void   drawrect(graphics   painter,   int   mouse_x,   int   mouse_y)
{
        int   width   =   0;
        int   heigth   =   0;
        if   (mouse_y   <   rect.y)
        {
                rect.y   =   mouse_y;
                heigth   =   downpoint.y   -   mouse_y;
        }
        else
        {
                heigth   =   mouse_y   -   downpoint.y;
        }
        if   (mouse_x   <   rect.x)
        {
                rect.x   =   mouse_x;
                width   =   downpoint.x   -   mouse_x;
        }
        else
        {
                width   =   mouse_x   -   downpoint.x;
        }
        rect.size   =   new   size(width,   heigth);     字串8  
        painter.drawrectangle(pen,   rect);
}    
private   image   drawscreen(image   back,   int   mouse_x,   int   mouse_y)
{
        graphics   painter   =   graphics.fromimage(back);
        drawrect(painter,   mouse_x,   mouse_y);
        return   back;
}
private   void   moverect(image   image,   rectangle   rect)
{
        graphics   painter   =   graphics.fromimage(image);
        painter.drawrectangle(pen,   rect.x,   rect.y,   rect.width,   rect.height);
        drawrects(painter);
        mainpainter.drawimage(image,   0,   0);
        image.dispose();
}   字串9  

发表于:2007-10-20 13:29:352楼 得分:0
并不是qq的截图功能,和photoshop中的套索工具一样的功能,只不过是将其选择的颜色值的颜色的区域加载入内存然后将其(区域轮廓)保存在一个文件中(c:\white.bmp),请问有什么办法呢?
例如一幅图片中有黑色的部分全部拷贝入内存(赋予变量a),然后将a(隐藏式的画图软件)保存入c:\white.bmp

我要将上图中的绿色部分保存到c:\white.bmp
发表于:2007-10-20 13:32:053楼 得分:0
图片没有显示成功,图片的url在
发表于:2007-10-21 15:15:564楼 得分:0
图片没有显示成功

csdn的大侠们,帮帮忙!!
多谢!!
发表于:2007-10-21 18:13:295楼 得分:0
      内存   和   硬盘有甚么区别嘛??
              你用cbitmap   类实现一个对象   不就完了
发表于:2007-10-22 20:37:446楼 得分:0
大佬
我用的是vb,不是vc++
vb中真的没有牛人了吗?
发表于:2007-10-23 14:32:347楼 得分:0
大佬
没有思路,哪怕你用d++都没用


快速检索

最新资讯
热门点击