ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4304|回复: 10

[分享] 图片与颜色

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-8-6 22:22 | 显示全部楼层 |阅读模式
以下部分内容摘抄自百度。

说道图片,就要提到颜色,计算机表示颜色用二进制表示。
16位色的发色总数是65536色,也就是2的16次方;
24位色被称为真彩色,它可以达到人眼分辨的极限,发色总数为2^24,即1677多万色;
32位色并非是2^32的发色数,它其实增加了8位的阿尔法透明通道,剩余的24位用于颜色位。

增加的专用透明通道,能够轻而易举地实现半透明窗口、菜单渐隐和阴影等效果。

描述一幅图像需要使用图像的属性,图像的属性主要包括分辨率、像素深度、颜色/彩色、图像的表示法和种类等。
颜色,分为真彩色、伪彩色和直接色。
1、 真彩色
是指在组成一幅彩色图像的每个像素值中,有R,G,B三个基色分量,每个基色分量直接决定显示设备的基色强度,这样产生的彩色称为真彩色。
很多场合,真彩色就是指 RGB 8:8:8,即R,G,B都用8位来表示,即24位真彩色。
也有部分场合,用RGB 5:5:5来表示,即每个彩色分量占5个位,再加1位显示属性控制位,生成的真颜色数目为2^15 = 32768 = 32K
2、 伪彩色
像素的颜色不是由每个基色分量的数值直接决定,而是把像素值当作彩色查找表CLUT的表项入口地址,去查找一个显示图像时使用的R,G,B强度值,用查找出的R,G,B强度值产生的彩色称为伪彩色。彩色查找表CLUT是一个事先做好的表,表项入口地址也称为索引号。彩色图像本身的像素数值和彩色查找表的索引号有一个变换关系,这种关系既可以是系统提供的,也可以是自定义的。使用查找得到的数值显示的彩色是真的,但不是图像本身真正的颜色,它没有完全反映原图的彩色。
3、直接色
每个像素值分成R,G,B分量,每个分量作为单独的索引值对它做变换。也就是通过相应的彩色变换表找出基色强度,用变换后得到的R,G,B强度值产生的彩色称为直接色。它的特点是对每个基色进行变换。
用这种系统产生颜色与真彩色系统相比,相同之处是都采用R,G,B分量决定基色强度,不同之处是后者的基色强度直接用R,G,B决定,而前者的基色强度由R,G,B经变换后决定。因而这两种系统产生的颜色就有差别。
试验结果表明,使用直接色在显示器上显示的彩色图像看起来真实、很自然。这种系统与伪彩色系统相比,相同之处是都采用查找表,不同之处是前者对R,G,B分量分别进行变换,后者是把整个像素当作查找表的索引值进行彩色变换。


TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-6 22:40 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 wangg913 于 2015-8-6 22:42 编辑

** 灰度 **
所谓灰度色,就是指纯白、纯黑以及两者中的一系列从黑到白的过渡色。我们平常所说的黑白照片、黑白电视,因此应该称为灰度照片、灰度电视比较确切。
在计算机领域中,灰度(Gray scale)数字图像是每个像素只有一个采样颜色的图像。这类图像通常显示为从最暗黑色到最亮的白色的灰度。
用于显示的灰度图像通常用每个采样像素8 bits的非线性尺度来保存,这样可以有256种灰度(8bits就是2的8次方=256)。这种精度刚刚能够避免可见的条带失真,并且非常易于编程。
对于24位真彩色来说,8位的R、G、B基色,三色值相同。
下面的代码,用来在屏幕上显示灰度条。
代码首先生成画笔,然后与屏幕句柄进行颜色管理,之后在屏幕上从左至右依次画由深至浅的灰度色线条。最终生成一个渐变的灰度带。
代码如下
  1. Private Type POINTAPI
  2.     x As Long
  3.     y As Long
  4. End Type
  5. Private Const PS_SOLID = 0
  6. Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
  7. Private Declare Function CreatePen Lib "gdi32" (ByVal nPenStyle As Long, ByVal nWidth As Long, ByVal crColor As Long) As Long
  8. Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
  9. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  10. Private Declare Function MoveToEx Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, lpPoint As POINTAPI) As Long
  11. Private Declare Function LineTo Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long

  12. Private Sub CommandButton1_Click()
  13.     Dim scrPT As POINTAPI
  14.     Dim scrHDC&, gHPen&
  15.     Dim I%, GreyLineWid As Byte
  16.     Dim GreyBarHei As Byte
  17.     GreyBarHei = 150
  18.     GreyLineWid = 2
  19.     '获得屏幕句柄
  20.     scrHDC = GetWindowDC(0)
  21.     If scrHDC <> 0 Then
  22.         For I = 0 To 255
  23.             '创建/重置画笔
  24.             gHPen = CreatePen(PS_SOLID, GreyLineWid, RGB(I, I, I))
  25.             If gHPen <> 0 Then
  26.                 SelectObject scrHDC, gHPen      '屏幕灰度颜色管理
  27.                 MoveToEx scrHDC, 200 + I * GreyLineWid, 400, scrPT
  28.                 LineTo scrHDC, 200 + I * GreyLineWid, 400 + GreyBarHei
  29.                 DeleteObject gHPen
  30.             End If
  31.         Next
  32.         
  33.         '在灰度条外面画黑色框
  34.         gHPen = CreatePen(PS_SOLID, GreyLineWid + 1, vbBlack)
  35.         SelectObject scrHDC, gHPen
  36.         MoveToEx scrHDC, 200 - 1, 400 - 4, scrPT
  37.         LineTo scrHDC, 200 + I * GreyLineWid + 4, 400 - 4
  38.         LineTo scrHDC, 200 + I * GreyLineWid + 4, 400 + GreyBarHei + 4
  39.         LineTo scrHDC, 200 - 1, 400 + GreyBarHei + 4
  40.         
  41.         '删除自定义画笔
  42.         DeleteObject gHPen
  43.     End If
  44. End Sub
复制代码


20150804-屏幕显示灰度条-2.rar (19.51 KB, 下载次数: 83)

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-6 22:45 | 显示全部楼层
本帖最后由 wangg913 于 2015-8-6 22:46 编辑

占位。。。。。。BMP图片的数据存储结构

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-6 22:47 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

读取24位真彩色BMP图片到数组,并在屏幕上显示

本帖最后由 wangg913 于 2015-8-7 10:04 编辑

BMP图片的4位色和8位色,部分可能是压缩存储格式的。
因此,为简便起见,暂先就24位真彩色BMP图片的读取进行举例。以后将就压缩格式的图片,进行解压举例。
  1. Option Explicit
  2. Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
  3. Private Declare Function SelectObject Lib "gdi32" (ByVal hdc As Long, ByVal hObject As Long) As Long
  4. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
  5. Private Declare Function SetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long

  6. '*API BMP位图数据结构
  7. Private Type BITMAPFILEHEADER    'Bitmap File Header
  8.     bfType As Integer
  9.     bfSize As Long          'BMP图像文件的大小
  10.     bfReserved1 As Integer
  11.     bfReserved2 As Integer
  12.     bfOffBits As Long
  13. End Type
  14. Private Type BITMAPINFOHEADER    'Bitmap Information Header
  15.     biSize As Long          '本结构的大小,根据不同的操作系统而不同,在Windows中,此字段的值总为28h字节=40字节
  16.     biWidth As Long         'BMP图像的宽度,单位像素
  17.     biHeight As Long
  18.     biPlanes As Integer
  19.     biBitCount As Integer
  20.     biCompression As Long
  21.     biSizeImage As Long     'BMP图像数据大小,必须是4的倍数,图像数据大小不是4的倍数时用0填充补足
  22.     biXPelsPerMeter As Long '水平分辨率,单位像素/m
  23.     biYPelsPerMeter As Long
  24.     biClrUsed  As Long
  25.     biClrImportant As Long
  26. End Type

  27. Private Sub CommandButton1_Click()
  28. Dim bFile As Byte, scrHDC As Long
  29. Dim bfHeader As BITMAPFILEHEADER
  30. Dim biHeader As BITMAPINFOHEADER
  31. Dim bWid As Long, bHei As Long
  32. Dim cR As Byte, cG As Byte, cB As Byte
  33. Dim bit24Col() As Byte, BytesPerLine As Long
  34. Dim PixelCol As Long
  35. Dim A As Long, B As Long
  36. Dim rectLeft As Long, rectTop As Long

  37. rectLeft = 100
  38. rectTop = 300
  39. bFile = FileSystem.FreeFile
  40. Open ThisWorkbook.Path & "\maomi.bmp" For Binary As bFile
  41. Get bFile, , bfHeader
  42. Get bFile, , biHeader
  43. With biHeader
  44.     BytesPerLine = .biSizeImage / .biHeight
  45.     bWid = .biWidth
  46.     bHei = .biHeight
  47. End With
  48. ReDim bit24Col(BytesPerLine - 1, bHei - 1)
  49. Get bFile, , bit24Col

  50. '获得屏幕句柄,然后在屏幕画点
  51. scrHDC = GetWindowDC(0)
  52. For A = bHei - 1 To 0 Step -1
  53.     For B = 0 To bWid - 1
  54.         cR = bit24Col(B * 3 + 2, A)
  55.         cG = bit24Col(B * 3 + 1, A)
  56.         cB = bit24Col(B * 3, A)
  57.         PixelCol = RGB(cR, cG, cB)
  58.         SetPixel scrHDC, rectLeft + B, rectTop + bHei - A, PixelCol
  59.     Next
  60. Next
  61.    
  62. '删除屏幕句柄
  63. DeleteObject scrHDC
  64. End Sub
复制代码


20150807-读取24位真彩色BMP图片到数组.rar (138.69 KB, 下载次数: 74)

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-6 23:01 | 显示全部楼层
占位。。。。。。
解析BMP图片的压缩存储方式,解压和存储办法。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-6 23:02 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
占位。。。。。。
各种图片格式的互相转换。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-6 23:04 | 显示全部楼层
占位。。。。。。
图片文件的读取、转存方式。
文件到内存,文件到数组,文件到粘贴板。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-7 10:24 | 显示全部楼层
本帖最后由 wangg913 于 2015-8-7 12:26 编辑

将24真*彩^色图片转换为灰度图片

转换灰度色,有个常用的转换方法。
即灰度基量(RGB三色同值)= (R * 77 + G * 150 + B * 29)>>8
VBa 代码就是  GreyComponent =  ((R * 77 + G * 150 + B * 29) And &HFF00) / 256

只是判断一下,重新赋值,代码就不贴了,附件如下:
20150807-读取24位真彩色BMP图片到数组-屏幕显示转换后的灰度图片.rar (140.23 KB, 下载次数: 81)

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-8-7 11:51 | 显示全部楼层
本帖最后由 wangg913 于 2015-8-16 20:57 编辑

灰度图片的二值化,代码就不贴了。
20150807-读取24位真彩色BMP图片到数组-屏幕显示转换后的二值化灰度图片.rar (225.92 KB, 下载次数: 74)

此贴的二值化,是固定阈值。
===================================
自适应阈值的求解方法见链接:
http://club.excelhome.net/thread-1222948-1-1.html
===================================

TA的精华主题

TA的得分主题

发表于 2016-11-20 16:39 | 显示全部楼层
版主,你好,你的真彩色是bmp图像格式,如果是图片改成是jpg格式的,如何修改成灰度图?请版主指点,谢谢!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-23 19:41 , Processed in 0.044164 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表