• 按键公众号 :
按键精灵电脑版
立即下载

软件版本:2014.06
软件大小:22.9M
更新时间:2021-12-03

按键精灵安卓版
立即下载

软件版本:3.7.2
软件大小:46.2M
更新时间:2023-05-10

按键精灵iOS版
立即下载

软件版本:1.8.0
软件大小:29.2M
更新时间:2023-03-21

按键手机助手
立即下载

软件版本:3.8.0
软件大小:262M
更新时间:2023-05-30

快捷导航

登录 后使用快捷导航
没有帐号? 注册

返回列表 12345678» / 23
发新话题 回复该主题

[技术交流] 【院刊】-【201409期】RGB分量之偏色与彩色图片转黑白 [复制链接]

1#

RGB分量之偏色与彩色图片转黑白




颜色对于制作脚本来说是至关重要的,找图找字找色都需要使用到颜色。所以,对颜色的认识是也是非常重要的。



颜色知识大解剖


颜色是由三原色混合形成的


* 即红、绿、三原色可以混合出所有的颜色。
* 我们通常把三原色简称为RGB(RGB红(Red)绿(Green)蓝(Blue)的缩写

* R的值区间是 0~255 这是十进制,转换成十六进制就是:00-FF (GB也是一样)


RGB

*我们前面说,一个颜色是由三原色RGB构成的,例如白色(RGB值都为255时显示白色):

*十六进制表示:FFFFFF (十六进制一共有六位,每两位表示一个原色)

*十进制表示:255,255,255




按键精灵颜色表示格式BGR

应该有很多童鞋都知道,其实,我们按键的颜色表示并不是RGB的顺序来表示的,按键使用的表示方式是BGR,把RB的位置互换了。

所以,有的时候,我们可能会遇到这样的情况:


甲:“为什么!为什么我用XX颜色工具获取到的颜色不能识别!”
乙:“哎呀,你看看你代码啊,那么乱说不定哪里错了。”
甲:“滚!给我圆滚滚的滚!哥的代码虽乱但那都是精华,怎么会错。"

甲因为不知道颜色知识,不知道按键颜色排列是BGR,也不知道xx颜色工具获取的颜色排列是RGB,所以苦恼了很久都没有找到问题所在。



RGB颜色格式转换为BGR

如果我们遇到这样的情况怎么办呢?其实,解决方法不麻烦,你看,一个BGR 一个RGB,就是把RB的位置调换了而已,那再把它调回来不就得了么?

问题是……要怎么个调法?


例如:FF0033

我们的思维很快,一秒钟就换过来了,RGB变成BGR 前后两位互调,那就是3300FF


换成代码思路也不麻烦:

1、获取颜色值:FF0033

2、用字符处理函数分割获取到的颜色值:FF|00|33 分别赋值给变量 R、G、B

3、将RGB三个字符变量合成,顺序为BGR


那么生成代码就是这个样子:
  1. sColor = "FF0033"
  2. LenRGB = Len(sColor)
  3. R= Mid(sColor, 1, 2)
  4. G= Mid(sColor, 3, 2)
  5. B= Mid(sColor, 5, 2)
  6. MessageBox "BGR:" &B & G&R
  7. 按键中还有个更方便的命令,不过这个命令,分出来的值是十进制的值:
  8. GetColor ="FF0033"
  9. Call Plugin.Color.ColorToRGB(GetColor, R, G, B)
  10. Msgbox " R:" & R & vbcrlf & " G:" & G & vbcrlf & " B:" & B
复制代码





RGB分量之偏色


大漠找字中的偏色


上面说到,把颜色分割成RGB三原色(分割颜色又称为分量),那么,分割颜色除了转换RGBBGR还有其它的功用吗?

答案是肯定的,应该有很多童鞋都使用过大漠工具,在大漠工具找字里,可以设置偏色。


偏色是什么呢?就是设定一个颜色范围,当获取的颜色在这个范围内的时候都能找到。对偏色不熟悉的童鞋可以看下我们之前的院刊帖子,关于大漠找字偏色的帖子:showtopic.aspx?topicid=543327&forumpage=1&page=1

偏色,听起来很深奥的样子,它其实就是由我们的RGB分量来实现的。




偏色大致思路:


1、设置颜色范围 例如:0000FF-FFFFFF

2、 获取颜色值,并且使用ColorToRGB 命令把颜色值进行分量,赋值给变量R、G、B

3、获取颜色范围0000FF,用colorToRGB命令将它分量,赋值给变量R1、G1、B1

4、获取颜色范围FFFFFF,用colorToRGB命令将它分量,赋值给变量R2、G2、B2

5、判断颜色值是否超过设定的范围



参考代码如下:
  1. min = "0000FF "
  2. max ="FFFFFF"
  3. GetColor=GetPixelColor(0, 0) //获取0,0点颜色
  4. Call Plugin.Color.ColorToRGB(GetColor, R, G, B) //将0,0点颜色分割
  5. Msgbox "RGB值:"& R&","& G&","&B
  6. Call Plugin.Color.ColorToRGB(min, R1, G1, B1)//将最小范围颜色 000000 分割
  7. Call Plugin.Color.ColorToRGB(max, R2, G2, B2)//将最大范围颜色 FFFFFF 分割
  8. S = S & "R:" & R1 & "~" & R2 & vbcrlf
  9. S = S & "G:" & G1 & "~" & G2 & vbcrlf
  10. S = S & "B:" & B1 & "~" & B2 & vbcrlf
  11. Msgbox "RGB分量区间(偏色范围):"& vbcrlf & vbcrlf & S
  12. If R<= R2 and R>= R1 and G<= G2 and G>= G1 and B<= B2 and B>=B1 Then //判断是否在000000-FFFFFF范围内
  13. MessageBox "该点颜色值在"& min &"~" & max &"范围内。"
  14. Else
  15. MessageBox "该点颜色值不在"& min &"~" & max &"范围内。"
  16. End If
复制代码




RGB分量之彩色图片转黑白

那我们的RGB分类还有没有其他的功用呢?
答案是肯定的,例如,彩色照片转换成黑白照片,还有大漠工具里的二值化,这些都是通过RGB颜色分量来实现的。

那么,怎样才能让颜色二值化变成黑白两色呢?

首先,我们要先了解下一个阈值这个东西,它是基于图片亮度的一个黑白分界值,默认值是50%中性灰,既128,亮度高于128(<50%的灰)的会变白,低于128(>50%的灰)的会变黑.


简单的理解:阈值就是颜色的分界线,利用这条分界线,我们就可以将彩色的图片转换为黑白的。



二值化转换思路

1、获取要转换为黑白颜色的图片区域

2、取出区域里的每个像素点

3、把这些像素点的颜色进行分量,如果RGB三原色的平均值大于128则把该像素点的颜色修改为白色,小于则修改为黑色 (也可以大于128的修改为黑色,小于的为白色)



参考代码如下:
  1. Dim My(63,63) //定义二维数组 ——需要二值化的区域
  2. For x= 0 To 63
  3. For y = 0 To 63
  4. GetColor = GetPixelColor(x, y) //获取区域里每个像素点的颜色
  5. If 二值化(GetColor) = 1 Then //调用二值化函数判断是当前颜色点是否大于128
  6. My(x, y) = "000000" //小于则输出黑色
  7. Else
  8. My(x,y) = "FFFFFF" //大于则输出白色
  9. End If
  10. Next
  11. Next
  12. Function 二值化(sColor)
  13. 二值化= 1
  14. Plugin.Color.ColorToRGB sColor, R, G, B //将颜色值分量
  15. If (R + G + B) / 3+1 >= 128 Then 二值化 = 0 //如果RGB平均值大于128
  16. End Function

  17. ///////////////用屏幕输出命令打印出图像///////
  18. For i = 63 To 0 step -1 //为什么是倒着的顺序呢?因为█这个符号所打印出来的图像会出现白色的间隙,倒着打印可以盖住这些间隙
  19. For j = 63 To 0 step -1
  20. Call Plugin.Msg.ShowScrTXT(i, j, i+10, j+10, "█",My(i, j) ) //█这个符号用来代表像素点,My(i, j) 这里面存放的颜色值决定像素点的颜色。
  21. Next
  22. Next
复制代码
效果图:

您所在的用户组无法下载或查看附件
您所在的用户组无法下载或查看附件


左边是原图,右边是二值化的。




拓展:


我们还可以修改这一段,当RGB平均值大于128 时输出绿色

  1. If 二值化(GetColor) = 1 Then //调用二值化函数判断是当前颜色点是否大于128
  2. My(x, y) = "6EB33A" //小于则输出绿色
  3. Else
  4. My(x,y) = "FFFFFF" //大于则输出白色
  5. End If
复制代码

效果图:


您所在的用户组无法下载或查看附件
您所在的用户组无法下载或查看附件


左边是原图,右边是二值化的。


有没有更简便的方法呢?




有的,可以使用365插件里的Binarization 二值化颜色命令来实现:

代码如下:

  1. Dim My(63,63) //定义二维数组 ——需要二值化的区域
  2. For x= 0 To 63
  3. For y = 0 To 63
  4. GetColor = GetPixelColor(x, y)//获取区域里每个像素点的颜色
  5. 二值化= Plugin.Plug365New.Binarization (GetColor,128)
  6. If 二值化 = 1 Then //调用二值化函数判断是当前颜色点是否大于128
  7. Plugin.Plug365New.SetColorPoint 0,x,y,"000000"

  8. Else
  9. Plugin.Plug365New.SetColorPoint 0,x,y,"FFFFFF"
  10. End If
  11. Next
  12. Next
复制代码

365插件下载(解压后复制到按键精灵安装目录下的plugin下使用)
您所在的用户组无法下载或查看附件



本文由按键学院提供技术支持


按键学院实战班(入驻最终幻想)火热招生


按键学院基础视频抢先观看


    已有4评分我要评分查看所有评分

    本主题由 超级版主 瑞祥幽冥狼 于 2023/7/10 8:50:23 执行 审核帖子 操作
    按键学院免费交流群:376122403

    按键学院招生计划
    按键学院系统教程
    2#

    棒棒哒

    3#

    脚本来说是至关重要的

    4#

    顶一个。。。。。。。。。。。。。。。。。。

    5#

    111111111

    6#

    学习下

    7#

    学习一下

    8#

    ***** 该内容需您回复才可浏览 *****

    9#

    dkdjdijfjdsjljf


    10#

    顶楼主,顶楼主

    11#

    新手慢慢学

    12#

    adsfasdfasdfasdfffffffffffffff

    13#

    fffuucckkyoouu

    14#

    好好学习 天天向上

    15#

    222222222222222222222222222222222222

    16#

    新手学习

    17#

    xuexile

    18#

    天天学习!!!!!!

    19#

    argge

    good good study,day day up
    20#

    8228582882828238

    发新话题 回复该主题