颜色转换助手RGB888-565

工作中有时需要将颜色的到模式转换,比如rgb888与rgb565之间,有时还需要选择图片上某处颜色,还要知道RGB值。为了方便,便做了个小软件。

1.rgb888与rgb565的转换

如下,888到565是有损失的。

        //根据RGB数值改变色盘颜色
        private void set_color()
        {
            if (btn_trans.Text.ToLower() == "rgb888")
            {
                colorshow.BackColor = Color.FromArgb((int)setR.Value, (int)setG.Value, (int)setB.Value);
            }
            else
            {
                colorshow.BackColor = Color.FromArgb((int)setR.Value << 3, (int)setG.Value << 2, (int)setB.Value << 3);
            }
        }

2.颜色拾取

这里要用到WINDOWS API

        public Timer tim_getcolor = new Timer();
	[DllImport("user32.dll")]//取设备场景 
        private static extern IntPtr GetDC(IntPtr hwnd);//返回设备场景句柄 
        [DllImport("gdi32.dll")]//取指定点颜色 
        private static extern int GetPixel(IntPtr hdc, Point p);
	tim_getcolor.Interval = 200;
        tim_getcolor.Tick += delegate
            {
                
                    Point p = new Point(MousePosition.X, MousePosition.Y);//取置顶点坐标 
                    IntPtr hdc = GetDC(new IntPtr(0));//取到设备场景(0就是全屏的设备场景) 
                    int c = GetPixel(hdc, p);//取指定点颜色 , Color.FromArgb(c)中c是argb或rgb排列,这里是bgr
                    int r = (c & 0xFF);//转换R 
                    int g = (c & 0xFF00) / 256;//转换G 
                    int b = (c & 0xFF0000) / 65536;//转换B 
                    this.colorshow.BackColor = Color.FromArgb(r, g, b);
                    lab_loc.Text = p.ToString(); //显示坐标
            };
处理按钮点击事件

        private void btn_pick_Click(object sender, EventArgs e)
        {
            if ( isClickInBtn == false)
            {
                this.btn_pick.Enabled = false;
                tim_getcolor.Enabled = true;
                tim_getcolor.Start();
            }
            isClickInBtn = false;
        }
还有全局鼠标按下事件,这里需要使用鼠标的钩子函数

        //按下鼠标键事件
        private void mh_MouseDownEvent(object sender, MouseEventArgs e)
        {
            if ( tim_getcolor.Enabled == true && e.Button == MouseButtons.Left)
            {
                tim_getcolor.Stop();
                tim_getcolor.Enabled = false;

                allowTansColor = false;
                colorTOrgbval(this.btn_trans.Text, this.colorshow.BackColor);
                allowTansColor = true;
                setrgbvalTXT();

                this.btn_pick.Enabled = true;
                Point formPoint = this.btn_pick.PointToClient(Control.MousePosition);
                if (this.btn_pick.ClientRectangle.Contains(formPoint)) //点到按钮
                {
                    isClickInBtn = true;
                }   
            }
        }
由于代码太多没法全部贴出,感兴趣的可以下载

1.exe文件:http://download.csdn.net/download/wangzibigan/10165053

2.源码:http://download.csdn.net/download/wangzibigan/10165055

3.效果




PS:发现获取屏幕像素时加个放大镜功能会好一点

1.创建一没边框窗体A。

2.点击获取按钮时,获取屏幕位图。

3.将桌面位图的相应部分绘制到窗体A。

		FormMagnifier formMagnifier = new FormMagnifier(); //新建一窗体,窗体为无边框
		ScreenBmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height);
                Graphics gs = Graphics.FromImage(ScreenBmp);   
                gs.CopyFromScreen(new Point(0, 0), new Point(0, 0), ScreenBmp.Size);//截屏
                gs.Dispose();
		formMagnifier.Location = new Point(MousePosition.X -formMagnifier.Width/ 2, MousePosition.Y -formMagnifier.Height/2);
                formMagnifier.BackgroundImage = new Bitmap(formMagnifier.Width, formMagnifier.Height);
                gs = Graphics.FromImage(formMagnifier.BackgroundImage);
                gs.DrawImage(ScreenBmp, new Rectangle(0, 0, formMagnifier.Width, formMagnifier.Height), new Rectangle(MousePosition.X - formMagnifier.Width / magnification / 2, MousePosition.Y - formMagnifier.Height / magnification / 2, formMagnifier.Width / magnification, formMagnifier.Height / magnification), GraphicsUnit.Pixel);
                gs.Dispose();
                formMagnifier.Show();
在定时器事件里加上

formMagnifier.Location  = new Point(MousePosition.X - formMagnifier.Width / 2, MousePosition.Y - formMagnifier.Height / 2);
                    Graphics gs = formMagnifier.CreateGraphics();
                    gs.DrawImage(ScreenBmp, new Rectangle(0, 0, formMagnifier.Width, formMagnifier.Height), new Rectangle(MousePosition.X - formMagnifier.Width / magnification/2, MousePosition.Y - formMagnifier.Height / magnification / 2, formMagnifier.Width / magnification, formMagnifier.Height / magnification), GraphicsUnit.Pixel);
                    gs.Dispose();
效果如下:(我用系统自带的工具截图,鼠标截不了,实际上是有鼠标光标的)






  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值