- 浏览: 141731 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (172)
- java (172)
- c# winform 关于窗体最大化时的是否全屏效果与是否遮盖任务栏 (1)
- c# winform 只运行一个程序实例 (1)
- Shiro权限框架 (1)
- Java字节码(.class文件)的代码解析 (1)
- Hibernate、Spring和Struts工作原理及使用理由 (1)
- 基本PKG处理命令 (1)
- 最近写的代码的小结 (1)
- Dual Palindromes (1)
- 编译TortoiseSVN1.7源代码笔记 (1)
- Android项目代码混淆 (1)
- 关于就业叨咕几句 (1)
- Java重定向System.out和System.err (1)
- IHS与WAS集成插件静默安装 (1)
- 专题地图概述 (1)
- 关于MapXtreme2004附带Sample不能运行的问题 (1)
- SQL注入漏洞 (1)
- 回顾过去 展望未来(写给自己) (1)
- DB2认证考试经验谈(700&&701) (1)
- 今天用到了RM格式文件的分割工具RealProducer (1)
- 搜索引擎还是很有发展前途的 (1)
- 泰利德破解,实现学校机房免费上网 (1)
- Arduino 引言:移动互联外设传感展望 (1)
- c/c++ static 用法总结(三版本合一) (1)
- JQuery与xml的组合谈 (1)
- Android开发之消息处理机制(一)——Handler (1)
- Android开发之PopupWindow (1)
- 解析BitmapData.getPixel32()返回值因何不准确 (1)
- 关于Ext引用js的顺序问题 (1)
- Js事件大全 (1)
- 使用JavaFX2.0编写国际象棋游戏 (1)
- Hibernate/JPA常见异常分析与解决 (1)
最新评论
-
amcucn:
这排版看得
Shiro权限框架 -
WAMING5:
这也太紧凑了,眼看花了
Shiro权限框架 -
longzhun:
大虾 ,看得出你很懒啊!发个贴 这样子怎么看!!!
Shiro权限框架 -
swanky_yao:
活干的不细!!
Spring+Hibernate框架下Mysql读写分离、主从数据库配 -
饶首建:
不错,不过用处比较少吧
批处理设ip和dns
解析BitmapData.getPixel32()返回值因何不准确
<div style="width: 610px; overflow: hidden;">
事情发展的起因是这样的:BitmapData.getPixel32()返回值不准确,为什么? 网友Norris很热心,他把他的观点写得井井有条:http://www.norris2u4.com/?p=370 。在继续往后阅读前,先看看我的总结,造成 getPixel32() 返回值存在偏差的根本原因是:BitmapData 存储的像素数据并不是各通道(ARGB)的原始数据,而是 RGB 跟 Alpha 通道相乘后的数据。在调用 BitmapData.getPixel32() 方法时,Flash Player 虽然返回的是未经相乘的 ARGB 数据,但这个数据是还原后的 ARGB ,而不是原始 ARGB 。以下例子说明了这一点:
var bmd:BitmapData = new BitmapData(100, 100, true, 0);<br>bmd.setPixel32(0, 0, 0×44536435); // 把坐标为(0, 0)的点设置颜色值 0×44536435<br>trace(bmd.getPixel32(0, 0).toString(16)); // 输出 44526534 ,明显有偏差
原始的 ARGB 数据 0×44536435(十六进制):
Alpha = 0×44;(透明通道) <br>Red_原始 = 0×53;(红通道) <br>Green_原始 = 0×64;(绿通道) <br>Blue_原始 = 0×35;(蓝通道) <br>还原的 ARGB 数据 0×44526534 (十六进制):
Alpha = 0×44; <br>Red_还原 = 0×52; <br>Green_还原 = 0×65; <br>Blue_还原 = 0×34; <br>可以看得出,只有 Alpha 通道是准确的(始终不变),其余通道都有偏差。这是因为 还原的 ARGB 数据 是从 经过相乘后的 ARGB 数据 中还原过来的:
相乘过程:
原始的 ARGB 数据(0×44536435)在被 BitmapData 存储前都经过相乘,就是 RGB 跟 Alpha 通道相乘(把 Alpha 值转为一个百分比进行计算,这个百分比等于:Alpha/0xFF):
Alpha = 0×44; <br>Red_相乘 = Red * ( Alpha / 0xFF ) = 0×53 * ( 0×44 / 0xFF ) = 0×16; <br>Green_相乘 = Green * ( Alpha / 0xFF ) = 0×64 * ( 0×44 / 0xFF ) = 0×1A; <br>Blue_相乘 = Blue * ( Alpha / 0xFF ) = 0×35 * ( 0×44 / 0xFF ) = 0×0E; <br>还原过程:
还原过程就相乘过程的逆过程,就是把 RGB 除以 Alpha 通道(同样地,把 Alpha 值转为一个百分比进行计算,这个百分比等于:Alpha/0xFF):
Alpha = 0×44; <br>Red_还原 = Red_相乘 / ( Alpha / 0xFF ) = 0×16 / ( 0×44 / 0xFF ) = 0×52; <br>Green_还原 = Green_相乘 / ( Alpha / 0xFF ) = 0×1A / ( 0×44 / 0xFF ) = 0×61; <br>Blue_还原 = Blue_相乘 / ( Alpha / 0xFF ) = 0×0E / ( 0×44 / 0xFF ) = 0×34; <br>整个流程:原始数据 -> 相乘数据 -> 还原数据。分别对比 实验数据 和 理论分析数据 :
实验数据:
实际上,调用 getPixel32() 方法后得到:0×44526534 <br>理论分析数据:
按理论分析,调用 getPixel32() 方法后应用得到:0×44526134 <br>分析到现在,还是很郁闷。理论值跟实际值不同(其中红色文字的 Blue 通道不同)。按道理,让 getPixel32() 返回值产生偏差的原因就是以上所述,但,经过痛苦的分析后却又发现 让 getPixel32() 返回值产生偏差的原因不完全是以上所述。
总结:
?一切都是 Adobe Flash Player 的错,而不完全是 Adobe 的错。总之在开发过程中,一定要牢记:别指望 BitmapData 能准确存储每点像素的原始颜色值。最后奉上官方语言参考上的解说:
BitmapData 对象中的所有像素都作为预乘颜色值进行存储。预乘图像像素具有已经与 Alpha 数据相乘的红色、绿色和蓝色通道值。例如,如果 Alpha 值为 0,则 RGB 通道的值也为 0,与它们未经过相乘的值无关。这种丢失数据的情况可能会在执行操作时导致一些问题。所有 BitmapData 方法都采用并返回未经过相乘的值。内部像素表示形式在其作为值返回之前从经过预乘的形式转换为未经过相乘的形式。在设置操作过程中,设置原始图像像素之前,像素值是经过预乘的。
发表评论
-
Hibernate/JPA常见异常分析与解决
2012-02-07 17:24 15001. ClassNotFoundException: ... -
使用JavaFX2.0编写国际象棋游戏
2012-02-07 16:24 1088前面发布了不少Javafx2的教程,不觉手痒,想尝试一 ... -
Js事件大全
2012-02-04 15:34 784一般事件 事件 ... -
关于Ext引用js的顺序问题
2012-02-02 15:49 759今天自己搞了个ext的helloworld,所需的包都 ... -
Android开发之PopupWindow
2012-01-31 13:48 1675<h1>Android开发之PopupWi ... -
Android开发之消息处理机制(一)——Handler
2012-01-11 15:19 1166<h1>Android开发之消息处理机制( ... -
JQuery与xml的组合谈
2011-12-21 17:18 794JQuery与xml的组合谈 今天谈的是XML,学ja ... -
c/c++ static 用法总结(三版本合一)
2011-12-21 10:34 814<span style="&qu ... -
Arduino 引言:移动互联外设传感展望
2011-12-20 14:08 1325作者:mznewfacer (Wolf Geek) ... -
泰利德破解,实现学校机房免费上网
2011-12-20 13:58 944泰利德破解,实现学校机房免费上网<br> ... -
搜索引擎还是很有发展前途的
2011-12-19 11:49 959相信大家已经听说,在头几天,搜狐推出了一个专业搜索门户 ... -
今天用到了RM格式文件的分割工具RealProducer
2011-12-19 09:19 704项目要加一些视频文件,这些视频都是几个老师对数据结构课 ... -
DB2认证考试经验谈(700&&701)
2011-12-16 17:17 1113很多人都通过了D ... -
回顾过去 展望未来(写给自己)
2011-12-15 16:19 1494本来想用“昨天今天明天”做标题来着,但是人家本山大叔说 ... -
SQL注入漏洞
2011-12-15 12:19 716CSDN上的ASP.NET电子杂志下载下来看,就看到了 ... -
关于MapXtreme2004附带Sample不能运行的问题
2011-12-15 10:54 679</span> -
专题地图概述
2011-12-14 12:49 846<p class="MsoNorma ... -
IHS与WAS集成插件静默安装
2011-12-14 12:04 964<span style="col ... -
Java重定向System.out和System.err
2011-12-13 14:49 1171<div>继承PrintStream类: ... -
关于就业叨咕几句
2011-12-13 11:04 643公司开始去各个学校开宣讲会了,这让我想起又到招聘的季节 ...
相关推荐
delphi 找图找色 BitmapData.pas 使用方法请到原作者yeye55的blog查看, http://yeye55blog.blog.163.com/blog/static/19724102120111043252016/
BitmapData.draw方法是ActionScript 3.0中的一个重要功能,主要用在Adobe Flash环境中处理位图数据。这个方法允许开发者将一个显示对象(如Sprite、MovieClip或Bitmap)的可视内容复制到BitmapData对象上,从而实现...
BitmapData.pas 和 kbKernel.pas 这两个文件在IT领域中主要涉及到图像处理和自动化操作,特别是游戏或图形应用中的找图找色功能。在本文中,我们将深入探讨这两个关键概念及其在实际编程中的应用。 首先,...
王者找图对比程序,delphi制作,设定一个图,找另一个图上是否有这个图!
BitmapData.zip 文件是一个包含 Delphi 开发中使用的 BitmapData 单元的压缩包。这个单元主要是为了实现图像处理和颜色查找功能,对于 Delphi 开发者来说,它提供了一个高效且方便的工具来搜索和操作图像数据。让...
- BitmapDataExample3.as和BitmapDataExample3.swf:可能演示了使用BitmapData.draw()方法绘制DisplayObject,并可能展示了不同的绘制选项,如旋转、缩放或着色。 - BitmapDataExample5.as和BitmapDataExample5.swf...
var pixelColor:uint = bitmapData.getPixel(10, 10); // 获取坐标(10, 10)的像素颜色 bitmapData.setPixel(10, 10, 0xFF0000); // 将该点设置为红色 ``` 5. 图像滤镜 BitmapData支持应用滤镜,如模糊、渐变、发光等...
org.eclipse.swt.internal.gdip.BitmapData.class org.eclipse.swt.internal.gdip.ColorPalette.class org.eclipse.swt.internal.gdip.Gdip.class org.eclipse.swt.internal.gdip.GdiplusStartupInput.class org....
var color32:uint = bitmapdata.getPixel(i, j); var red:int = color32 >> 16; var green:int = color32 >> 8 & 0xFF; var blue:int = color32 & 0xFF; var redInt:int = screenBase(red, red); var ...
var pixel:uint = bitmapData.getPixel(x, y); // 将像素值转换为字符串并处理 } } ``` 字符串化的像素数据可以发送到服务器,服务器端可能使用JSON或其他数据格式进行解析,然后存储或进一步处理。这种处理方式...
total += bitmapData.getPixel32(x + i, y + j); } } return total / (w * h); } ``` 五、填充颜色块 `fillBlockWithColor()`函数用于将指定区域的像素颜色替换为平均颜色。 ```as3 function ...
var originalRatio:Number = bitmapData.width / bitmapData.height; // 自定义切割的宽高比例 var cutRatio:Number = 4 / 3; // 例如,4:3比例 var cutWidth:Number, cutHeight:Number; if (originalRatio...
通过本文的学习,我们了解到BitmapData.hitTest作为一种高级碰撞检测方法,在处理不规则图形之间的碰撞检测时具有显著优势。它不仅可以提高游戏的真实感,还能优化性能,为玩家提供更加流畅的游戏体验。开发者可以...
为提高效率,可以使用`lock()`和`unlock()`方法来批量处理像素,或者利用BitmapData的`getPixel32()`或`setPixel32()`方法只检查关键区域。 4. **实际碰撞检测实例**:在实际应用中,我们通常需要检测多个对象间的...
Marshal.Copy(bitmapData.Scan0, pixels, 0, pixels.Length); // 在pixels数组上处理像素 Marshal.Copy(pixels, 0, bitmapData.Scan0, pixels.Length); image.UnlockBits(bitmapData); ``` 3. 指针法: 指针法是...
var pixelColor:uint = bitmapData.getPixel(x, y); ``` 2. **阈值比较**:为了处理颜色差异,可以设置一个颜色阈值。如果目标像素颜色与背景颜色的差值小于阈值,则认为发生了碰撞。 3. **区域检测**:除了单个...
byte[] pixels = new byte[bitmapData.Stride * bitmap.Height]; Marshal.Copy(bitmapData.Scan0, pixels, 0, pixels.Length); bitmap.UnlockBits(bitmapData); ``` 在这里,`stride`是每一行像素的字节数,...
byte[] pixels = new byte[bitmapData.Stride * bitmapData.Height]; Marshal.Copy(bitmapData.Scan0, pixels, 0, pixels.Length); // 遍历并修改像素 for (int y = 0; y < bitmapData.Height; y++) { for (int x ...
byte[] imageData = new byte[bitmapData.Width * bitmapData.Height * bytesPerPixel]; Marshal.Copy(bitmapData.Scan0, imageData, 0, imageData.Length); bitmap.UnlockBits(bitmapData); ``` 以上代码会将图像...