工作中有时需要将颜色的到模式转换,比如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();
效果如下:(我用系统自带的工具截图,鼠标截不了,实际上是有鼠标光标的)