`
itoracja
  • 浏览: 141753 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论
阅读更多

    <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 方法都采用并返回未经过相乘的值。内部像素表示形式在其作为值返回之前从经过预乘的形式转换为未经过相乘的形式。在设置操作过程中,设置原始图像像素之前,像素值是经过预乘的。


 
0
0
分享到:
评论

相关推荐

    delphi 找图找色 BitmapData.pas

    delphi 找图找色 BitmapData.pas 使用方法请到原作者yeye55的blog查看, http://yeye55blog.blog.163.com/blog/static/19724102120111043252016/

    BitmapData.draw方法

    BitmapData.draw方法是ActionScript 3.0中的一个重要功能,主要用在Adobe Flash环境中处理位图数据。这个方法允许开发者将一个显示对象(如Sprite、MovieClip或Bitmap)的可视内容复制到BitmapData对象上,从而实现...

    BitmapData.pas和kbKernel.pas

    BitmapData.pas 和 kbKernel.pas 这两个文件在IT领域中主要涉及到图像处理和自动化操作,特别是游戏或图形应用中的找图找色功能。在本文中,我们将深入探讨这两个关键概念及其在实际编程中的应用。 首先,...

    王者找图对比程序.rar_BitmapData.pas_delphi 找图_对比找图_王找找图_王者找图对比程序

    王者找图对比程序,delphi制作,设定一个图,找另一个图上是否有这个图!

    BitmapData.zip

    BitmapData.zip 文件是一个包含 Delphi 开发中使用的 BitmapData 单元的压缩包。这个单元主要是为了实现图像处理和颜色查找功能,对于 Delphi 开发者来说,它提供了一个高效且方便的工具来搜索和操作图像数据。让...

    [转] BitmapData 基础部分2

    - BitmapDataExample3.as和BitmapDataExample3.swf:可能演示了使用BitmapData.draw()方法绘制DisplayObject,并可能展示了不同的绘制选项,如旋转、缩放或着色。 - BitmapDataExample5.as和BitmapDataExample5.swf...

    ActionScript 3 BitmapData 的例子

    var pixelColor:uint = bitmapData.getPixel(10, 10); // 获取坐标(10, 10)的像素颜色 bitmapData.setPixel(10, 10, 0xFF0000); // 将该点设置为红色 ``` 5. 图像滤镜 BitmapData支持应用滤镜,如模糊、渐变、发光等...

    org.eclipse.swt.win32

    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....

    as3实现图片lomo效果

    var color32:uint = bitmapdata.getPixel(i, j); var red:int = color32 &gt;&gt; 16; var green:int = color32 &gt;&gt; 8 & 0xFF; var blue:int = color32 & 0xFF; var redInt:int = screenBase(red, red); var ...

    cam.rar_flex_take photo online_web 拍照_web摄像头_在线拍照 像素

    var pixel:uint = bitmapData.getPixel(x, y); // 将像素值转换为字符串并处理 } } ``` 字符串化的像素数据可以发送到服务器,服务器端可能使用JSON或其他数据格式进行解析,然后存储或进一步处理。这种处理方式...

    flash图片马赛克

    total += bitmapData.getPixel32(x + i, y + j); } } return total / (w * h); } ``` 五、填充颜色块 `fillBlockWithColor()`函数用于将指定区域的像素颜色替换为平均颜色。 ```as3 function ...

    as3 等比切割图片,一键切割图片保存+自动命名图片

    var originalRatio:Number = bitmapData.width / bitmapData.height; // 自定义切割的宽高比例 var cutRatio:Number = 4 / 3; // 例如,4:3比例 var cutWidth:Number, cutHeight:Number; if (originalRatio...

    flash游戏开发第一张 高级碰撞检测

    通过本文的学习,我们了解到BitmapData.hitTest作为一种高级碰撞检测方法,在处理不规则图形之间的碰撞检测时具有显著优势。它不仅可以提高游戏的真实感,还能优化性能,为玩家提供更加流畅的游戏体验。开发者可以...

    Flash as3基于位图的碰撞检测实例

    为提高效率,可以使用`lock()`和`unlock()`方法来批量处理像素,或者利用BitmapData的`getPixel32()`或`setPixel32()`方法只检查关键区域。 4. **实际碰撞检测实例**:在实际应用中,我们通常需要检测多个对象间的...

    C#数字图像处理3种典型方法:提取像素法、内存法、指针法。

    Marshal.Copy(bitmapData.Scan0, pixels, 0, pixels.Length); // 在pixels数组上处理像素 Marshal.Copy(pixels, 0, bitmapData.Scan0, pixels.Length); image.UnlockBits(bitmapData); ``` 3. 指针法: 指针法是...

    flash像素级精确选择实现

    var pixelColor:uint = bitmapData.getPixel(x, y); ``` 2. **阈值比较**:为了处理颜色差异,可以设置一个颜色阈值。如果目标像素颜色与背景颜色的差值小于阈值,则认为发生了碰撞。 3. **区域检测**:除了单个...

    用c#实现图像处理:获取一幅图片的像素值及RGB分量

    byte[] pixels = new byte[bitmapData.Stride * bitmap.Height]; Marshal.Copy(bitmapData.Scan0, pixels, 0, pixels.Length); bitmap.UnlockBits(bitmapData); ``` 在这里,`stride`是每一行像素的字节数,...

    Visual C#图像处理程序设计实例

    byte[] pixels = new byte[bitmapData.Stride * bitmapData.Height]; Marshal.Copy(bitmapData.Scan0, pixels, 0, pixels.Length); // 遍历并修改像素 for (int y = 0; y &lt; bitmapData.Height; y++) { for (int x ...

    用来对bmp位图文件的读取与图像的数据保存.zip

    byte[] imageData = new byte[bitmapData.Width * bitmapData.Height * bytesPerPixel]; Marshal.Copy(bitmapData.Scan0, imageData, 0, imageData.Length); bitmap.UnlockBits(bitmapData); ``` 以上代码会将图像...

Global site tag (gtag.js) - Google Analytics