GDI+_从Bitmap里得到的Color数组值分解
[这里写只是我个人的摸索经历,已经给出解决方案] 我之前写过一篇关于ARGB值的研究:
https://www.cnblogs.com/lingqingxue/p/10362639.html 最近我又遇到关于ARGB的问题。 是这样的,我使用LockBits欲获取Bitmap里的所有ARGB数据,发现ARGB的值很奇怪。 例如 ARGB(255,0,2550) = -16711936 为什么等于-16711936? 会不会是十进制值呢? 在我上一篇上写到ARGB是由于 HEX A & HEX R & HEX G & HEX B 组成的 那么当我对他进行进制换算的时候得到的十六进制的值发现与我想象的完全不一样。 64bit : -16711936 = 00FF0100 如果是十六进制应该是 FF00FF00 。 所以到底是哪里出了问题呢? 我们追寻到ARGBColor的定义。 http://www.yfvb.com/help/gdiplus/index.htm?page=gdipcreatesolidfill.htm 上面是勇芳软件前辈们汉化的GDI+手册, 从 GdipCreateSolidFill() 函数我们可以看到
PowerBASIC 语法 FUNCTION GdipCreateSolidFill ( _ BYVAL pColor AS DWORD, _ BYREF brush AS DWORD _ ) AS LONG
pColor 参数是【DWORD】 类型! 那么什么是 【DWORD】呢?
【GM4】执着InkHin<lqx@tyningling.top> 17:23:47
vb的结果就是负数。
【管理员】→P-A-S-S-OK<basicstudio@qq.com> 17:23:59
因为VB不是DWORD
【管理员】→P-A-S-S-OK<basicstudio@qq.com> 17:24:22
VB6没有DWORD
【管理员】→P-A-S-S-OK<basicstudio@qq.com> 17:25:07
双字就是DWORD的意思 double word
【管理员】→P-A-S-S-OK<basicstudio@qq.com> 17:25:49
你去百度一下看看DWORD是啥意思
【GM4】执着InkHin<lqx@tyningling.top> 17:29:17
..... 那么,我一直在取一个错误的颜色值?
【管理员】ZL16(569919016) 17:30:01
@→P-A-S-S-OK 接着做数据
【管理员】→P-A-S-S-OK<basicstudio@qq.com> 17:30:24
我是说WIN7的计算器概念错误,但是对于你来说正好是有用的。
【管理员】→P-A-S-S-OK<basicstudio@qq.com> 17:31:05
经过Pass大叔的指导和百度的帮助,我得到关于 DWORD的含义:
Data Types
This topic lists the data types most commonly used in the Microsoft Foundation Class Library. Most of the data types are exactly the same as those in the Windows Software Development Kit (SDK), while others are unique to MFC.
Commonly used Windows SDK and MFC data types are as follows: BOOL A Boolean value.
BSTR A 32-bit character pointer.
BYTE An 8-bit integer that is not signed.
COLORREF A 32-bit value used as a color value.
DWORD A 32-bit unsigned integer or the address of a segment and its associated offset.
LONG A 32-bit signed integer.
LPARAM A 32-bit value passed as a parameter to a window procedure or callback function.
LPCSTR A 32-bit pointer to a constant character string.
LPSTR A 32-bit pointer to a character string.
LPCTSTR A 32-bit pointer to a constant character string that is portable for Unicode and DBCS.
LPTSTR A 32-bit pointer to a character string that is portable for Unicode and DBCS.
LPVOID A 32-bit pointer to an unspecified type.
LRESULT A 32-bit value returned from a window procedure or callback function.
UINT A 16-bit unsigned integer on Windows versions 3.0 and 3.1; a 32-bit unsigned integer on Win32.
WNDPROC A 32-bit pointer to a window procedure.
WORD A 16-bit unsigned integer.
WPARAM A value passed as a parameter to a window procedure or callback function: 16 bits on Windows versions 3.0 and 3.1; 32 bits on Win32.
Data types unique to the Microsoft Foundation Class Library include the following:
POSITION A value used to denote the position of an element in a collection; used by MFC collection classes. LPCRECT A 32-bit pointer to a constant (nonmodifiable) RECT structure.
然而,在实际情况中,DWORD会根据操作系统的不同,被定义成了不同的长度,比如vs8(xp)中,DWORD被定义成了如下的类型:
typedef unsigned long DWORD; 而unsigned long 的长度则是4个字节即32位,如果是在64位的操作系统中,这个长度可能会更长,这需要取决于当前操作系统以及开发环境等有关方面,具体可以参考相关的帮助说
坑爹啊有木有,这百度百科都不带解释的,幸好有翻译器,好了看如下:
数据类型 本主题列出了微软基础类库中最常用的数据类型。大多数数据类型与Windows软件开发工具包(SDK)中的数据类型完全相同,而其他数据类型则是MFC独有的。 常用的windows sdk和mfc数据类型如下:bool是一个布尔值。 一个32位字符指针。 字节一个8位整数,没有符号。 作为颜色值的32位值。 一种32位无符号整数或段地址及其相关偏移量。 长32位有符号整数。 lparam作为参数传递给窗口过程或回调函数的32位值。 指向常量字符串的32位指针。 指向字符串的32位指针。 lpctstr指向常量字符串的32位指针,可用于Unicode和DBCS。 lptstr指向字符串的32位指针,该字符串可用于Unicode和DBCS。 lpvoid指向未指定类型的32位指针。 lresult从窗口过程或回调函数返回的32位值。 ui在Windows 3.0和3.1版上输入16位无符号整数;在Win32上输入32位无符号整数。 wndproc指向窗口过程的32位指针。 字16位无符号整数。 wParam作为参数传递给窗口过程或回调函数的值:Windows版本3.0和3.1上的16位;Win32上的32位。 微软基金会类库唯一的数据类型包括: 位置用于表示元素在集合中的位置的值;由MFC集合类使用。lpcret指向常量(不可修改)rect结构的32位指针。 然而,在实际情况中,dword会根据操作系统的不同,被定义成不同的长度,比如vs8(xp)中,dword被定义成如下的类型: typedef unsigned long dword;而unsigned long的长度则是4个字节即32位,如果是在64位的操作系统中,这个长度可能会更长,这需要取决于当前操作系统以及开发环境等相关方面,具体可参考相关的帮助说明。
好的,从上面的翻译我们过滤后得到了这样的信息: DWORD 32位字符指针 字节一个八位整数(机器翻译的锅 8字节) 没有符号 作为颜色的32位值 然后我们对比一下BASIC的Long, Long 64位字符 有符号 8 字节 整数 (出处) 但是VB6版本没有DWORD这种数据类型该怎么办呢?
备注: 使用前缀 & h 或 & H 来表示十六进制文本前缀 & b 或 & B 来表示二进制文本和 前缀 & o 或 & O来表示八进制文本。 十进制文本没有前缀。
继续分析,DWORD 是32bit的字符 而 Long是 64bit的 ,但是他们共同点是8个字节
64/8 = 8 32/8 = 4 也就是说我们如果将前面的【ARGB(255,0,255,0) = -16711936 】 转化为32bit的整型,因为他们的类型都是整型,而且都是八个字节,那么转换就非常简单了!
将 -16711936 从十进制转换进制到二进制 :
1111 1111 1111 1111 1111 1111 1111 1111
1111 1111 0000 0000 1111 1111 0000 0000
将上边的转为32bit:
1111 1111 0000 0000 1111 1111 0000 0000
没错,只需要截取最后一段就够了,这样是不是还看不出来?那我们继续将它转换到十六进制和十进制。
十进制:
4278255360
十六进制:
FF00FF00
现在就很清楚了,将 FF00FF00 分解 为ARGB :
A: FF = 255
R : 00 = 0
G : FF = 255
B : 00 = 0
那么关于Bitmap得到的数据分解就到这里,另外还有一点要注意!
目前 GDI+ 这个古老的图形库,除了.PNG 格式支持 Alpha通道以外,其他支持图片都不具备透明的条件,只有png图片拥有ALPHA显示! 当你保存为BMP/JPG/GIF等支持类型格式时都会失去ALPHA效果,所以尽量在绘制带有A属性的图片时尽量保存为PNG以防失真与透明的消失!
GDI+_从Bitmap里得到的Color数组值分解的更多相关文章
- GDI+_从Bitmap里得到的Color数组值解决方案
' InkHin_ZhiZhuo ' Date :2019.2.18 ' E-mail lqx@tyningling.Top 'This function and Module is written ...
- Zookeeper_阅读源码第一步_在 IDE 里启动 zkServer(集群版)
上篇文章Zookeeper_阅读源码第一步_在 IDE 里启动 zkServer(单机版)讲了在 idea 里以单机的方式启动zookeeper,这篇介绍一下以集群的方式启动. 集群方式启动,才会真正 ...
- React-高阶函数_函数柯里化
高阶函数_函数柯里化 高阶函数(定义) 如果一个函数符合下面两个规范,就是高阶函数: 如果A函数,接收的参数是一个函数,那么A就是一个高阶函数(比如数组方法arr.map()接收的就是一个处理item ...
- PHP的数组值传入JavaScript的数组里
<!doctype html public "-//W3C//DTD HTML 4.0 //EN"> <html><head> &l ...
- Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数
Python第七天 函数 函数参数 函数里的变量 函数返回值 多类型传值 函数递归调用 匿名函数 内置函数 目录 Pycharm使用技巧(转载) Python第一天 ...
- 对<tr><td>标签里的input 循环取值
需求描述:单击table整行,跳转到具体的信息页面 关键就是获取整行的id,传给后台做查询,返回list 解决思路:用带参数函数传过去id,然后在js的函数中用$("#id"). ...
- php判断检测一个数组里有没有重复的值
php判断检测一个数组里有没有重复的值 php里有一个处理数组重复值得函数array_unique,我们的思路就是用这个函数来实现的. if (count($array) != count(array ...
- GDI+_入门教程【一】
GDI For VisualBasic6.0 [一]文件下载:GDI+ For VB6[一] 简单绘图实例演示百度网盘 1 '以下为作者[vIsiaswx]的教程 '(该教程发布的原地址已无法访问,此 ...
- 图片_ _优化Bitmap加载图片1
=========== 1 视图显示大量图片时的内存问题 setBackgroundResource 回去res 资源文件里面找适配手机当前屏幕的文件,所以消耗高,etBackgroundDra ...
随机推荐
- 记录一次Struts s2-045重大安全漏洞修复过程
[升级修复] 受影响用户可升级版本至Apache Struts 2.3.32 或 Apache Struts 2..5.10.1以消除漏洞影响. 官方公告:https://cwiki..apache. ...
- mac 中 git 操作账号的保存与删除
mac 系统中,运行命令:git config -l,输出中看到credential.helper=osxkeychain时,说明 git 密码保存在 Keychain 中. 右上角搜索框内搜索 gi ...
- 一、python中的一切皆对象
1.函数和类是对象,是Python中的一级公民 (1)将函数和类赋值给一个变量 将函数或类赋值给一个变量,就可以把该变量当成函数或类来使用 def ask(name): print(name) cla ...
- Linux系统下安装Angular2开发环境(Ubuntu16.0和deepin)
说明下,以下过程都是在ubuntu16.0系统下,win系统环境下的安装过程更简单,基本上可以仿效此环境来,除了不用配置系统命令(win下自动可以),node安装是exe程序,一键安装.另外,这里面像 ...
- [ZZ] matlab中小波变换函数dwt2和wavedec2 系数提取函数appcoef2和detcoef2
https://zhidao.baidu.com/question/88038464.html DWT2是二维单尺度小波变换,其可以通过指定小波或者分解滤波器进行二维单尺度小波分解. 而WAVEDEC ...
- Azure CosmosDB (11) MongoDB概念
<Windows Azure Platform 系列文章目录> Azure Cosmos DB兼容MongoDB的API,下表将帮助我们更容易理解MongoDB中的一些概念: SQL概念 ...
- python基础知识3---字符编码
阅读目录 一 了解字符编码的知识储备 二 字符编码介绍 三 字符编码应用之文件编辑器 3.1 文本编辑器之nodpad++ 3.2 文本编辑器之pycharm 3.3 文本编辑器之python解释器 ...
- 使用iframe方式获得svg中的DOM元素,和svg 的 contentDocument 返回 null
碰到这个的相关问题,百度找了好久,找到了个解决方法,原址 https://segmentfault.com/q/1010000009001758 var iframe = document.getEl ...
- TypeScript: this bind 和 回调的正确用法
TypeScript 中如果传递了 而且在回调函数中用了this 的话, 就要小心了, 这个this 不一定是指向当前类对象了,如果想确保指向的还是那个对象的话, 需要在传递那个方法的时候, 先调用b ...
- sql server 合并字段
合并字段用+号连接就可以了,不过要判断是不是有的合并项为NULL.如果其中一项为NULL,则整个合并字段为NULL. (IsNull(a.supplier, '') + IsNull(a.po, ' ...