AIR对Mobile设备位图取色的问题

AIR对Mobile设备位图取色的问题

在网页游戏开发中,我经常使用bitmapData.getPixel32来获得单击的部位的透明度值,以此来确定是否交互。

在PC平台中,这个用法是很靠谱的:

public function checkOpaque($x:Number,$y:Number):Boolean
{
    //如果没有图像,当然是透明的
    if(!this.bitmapData) return false;
    var __argb:uint = this.bitmapData.getPixel32($x,$y);
    //否则就判断透明度
    return  (__argb>>24&0xFF) > 0;
}

但是,到了Mobile平台上,这个方法就有问题,使用getPixel32获得透明部分的像素值,得到的是16777216!

这个值其实是2的24次方。也就是说,在Mobile平台上,getPixel32只能支持到24bit色彩!

那么,是不是我的设置不正确呢?在AIR项目配置文件中,可以设置colorDepth,默认值为16bit,将其设置为32bit,还是没有作用。

所以只能把判断函数改成这样了:

public function checkOpaque($x:Number,$y:Number):Boolean
{
    //如果没有图像,当然是透明的
    if(!this.bitmapData) return false;
    var __argb:uint = this.bitmapData.getPixel32($x,$y);
    trace('单击的像素的颜色:', __argb.toString(16));
    //手机上可能最大只能支持到24bit颜色,所以当颜色等于24bit颜色的最大值的时候,直接认为像素是透明的
    if(__argb == 0x1000000) return false;
    //否则就判断透明度
    return  (__argb>>24&0xFF) > 0;
}

测试 Flash Player 11.3/AIR 3.3 提供的 bitmapData.encode 方法的性能

原来在写 Sprite Sheet Editor 的时候,就发现 mx.graphics 包中提供的 JPEG 和 PNG 压缩程序的性能实在很差。用 JAVA 写的压缩器,在 JPEG 的压缩上比 mx.graphics.JPEGEncoder 要高20倍左右。

现在,Flash Player 11.3 beta1/AIR 3.3 beta1 终于为我们带来了原生支持的图像压缩功能。 继续阅读测试 Flash Player 11.3/AIR 3.3 提供的 bitmapData.encode 方法的性能

对RTMP视频流进行BitmapData.draw()出错的解决办法

在对Flash Media Server中的视频流使用BitmapData.draw()进行绘制的时候,会抛出这样异常:

cannot access rtmp://xxxxx. No policy files granted access.
at flash.display::BitmapData/draw()

这个错误出现的原因是,客户端(swf)没有权限复制NetStream中的原始视频数据。看提示,是需要一个策略文件。

但是,在FMS服务器上无法放置策略文件,FMS也不能像Socket服务器那样发送策略文件给客户端,这种情况应该怎么处理呢?

答案在这里:

http://help.adobe.com/en_US/flashmediaserver/ssaslr/WS5b3ccc516d4fbf351e63e3d11a11afc95e-7ec3SSASLR.html#WS5b3ccc516d4fbf351e63e3d11a11afc95e-7fcbSSASLR

只需要FMS在同意client连接后,为其设置videoSampleAccess属性即可。videoSampleAccess的设置方式与readAccess相同。

范例:

application.onConnect = function($client)
{ 
    application.acceptConnection($client);
    //设置成"/",允许所有路径
    client.videoSampleAccess = "/"; 
}

编辑Sprite Sheet的小工具:sprite sheet editor v0.6.2发布

2011-12-21:v0.6.2版发布

  1. 加入在SpriteSheet中增加帧的功能。帧只能增加到已有帧的末尾。
  2. 加入在打开SpriteSheet中增加SpriteSheet的功能。这样就可以实现多个SpriteSheet的合并。规则如下:
    • 所有帧会增加到当前Sheet的末尾;
    • 若label重名,则被导入Sheet中的label不导入,但依然会导入该lable的所有帧;
    • 若name重名,则被导入的Sheet中该name对应的重名帧不会被导入;
    • 若原始Sheet中包含name,但被导入Sheet中不含name,则会自动为被导入的Sheet中的所有帧命名。

更多的功能介绍以及软件下载,看这里

编辑Sprite Sheet的小工具:sprite sheet editor v0.5.9发布

2011-11-04:v0.5.9版发布

  1. 导入图像文件后,支持多选排序,支持“移到顶部/底部”。
    善用此功能,可对最终生成SpriteSheet进行排版,以降低最终文件的尺寸。
  2. 预览的背景可以在方格/白色/黑色之间切换,方便查看半透明的动画。

更多的功能介绍以及软件下载,看这里

将图像的透明区域转换为Alpha通道原理

Sprite Sheep Editor中,使用了这样的一个小技术(思路来自这里):将透明图像的Alpha通道转换成黑白(灰度)图像,然后与正常图像拼合成一张大图,再存储成JPEG格式。

这方法其实是一个折衷方案。因为JPEG格式是不支持透明的,很多时候为了获得透明效果,我们只能使用PNG格式。但PNG是无损压缩的,在图像尺寸上没有优势。如果将Alpha通道转换成黑白图并保存到JPEG图像中,就能大幅降低最终的图像文件大小。

在我的测试中,一个2000×3300的32位带Alpha通道的PNG图像文件大小为2MB,转换为4000×3300(因为拼合了黑白图片,宽度增加一倍)70%压缩比的JPEG后,文件大小为1.1MB。

当然,转换后的JPEG文件画质比PNG要稍差一些。这可以通过调整压缩比得到一定程度的改善。

要将图像的Alpha通道转换为黑白图像,在AS3中很容易: 继续阅读将图像的透明区域转换为Alpha通道原理

编辑Sprite Sheet的小工具:sprite sheet editor v0.5.7发布

2011-09-02:v0.5.7版发布

  1. 解决metadata中frame的的ow和oh与w和h相等的重大BUG
  2. 现在可以把帧还原到“修剪空白”前的状态;
  3. 使用SharedObject保存设置。目前仅实现了帧率的保存。

更多的功能介绍以及软件下载,看这里

编辑Sprite Sheet的小工具:sprite sheet editor v0.5.6发布

2011-08-23:v0.5.6版发布

  1. 加入缩小帧原始尺寸的功能;
  2. 删除帧后,会立即更新Sheet预览;
  3. 解决一些bug。

所有帧的原始尺寸是一个很有用的功能,例子:

一个角色的动作是由多帧组成的,为了配合占用最大空间的那一帧,每一帧中都会有一些多余的空白。虽然可以使用“修剪空白”功能来删除这些空白,但这只能降低保存的文件的大小。
在将角色载入到程序中的时候,空白依然是会占用内存空间的。
使用缩小帧原始尺寸这个功能,就能将每个动作中的所有帧的原始外边框尽量变小(当然是人工操作),以节省内存空间。

更多的功能介绍以及软件下载,看这里

编辑Sprite Sheet的小工具:sprite sheet editor v0.5.0发布

2011-08-18:v0.5.0版发布,同时更名为Sprite Sheet Editor

  1. 采用Flex重写了界面;
  2. 修改了生成Sheet的流程;
  3. 自动计算生成的Sheet的尺寸,自动计算支持“正方形”和“2的幂”;
  4. 可更改已生成的Sheet的尺寸和排列方式;
  5. 增加对Sheet中的帧周围空白区域的自动修剪;
  6. 可以采用可视化的方式修改截取区域;
  7. 可以对待拼合的图像文件进行排序;
  8. SpriteSheetMetadata格式小幅修改。

更多的功能介绍以及软件下载,看这里

SpriteSheet小工具:spritesheetpacker v0.4

2011-06-30:v0.4版发布

  1. 将菜单改为按钮,避免Mac等不支持菜单的操作系统无法显示菜单;
  2. 可以打开SpriteSheet格式的图片,然后保存成其他格式。即可以在SS、JPG、PNG之间互转格式;
  3. 可以打开已有的SpriteSheet,修改Metadata后保存成新的文件;
  4. 解决0.3版手动提供的元数据无效的问题;
  5. 播放位图动画的时候,在Sheet预览中显示当前帧的范围;
  6. 解决打开的SpriteSheet格式的Label起始帧显示不正常的问题;
  7. 采用SDK2.7编译。因此需要卸载原来的软件,再升级AIR Runtime,才能正常安装。(AIR的版本兼容性很糟糕,经常无法安装,而且给出错误的提示)

更多的功能介绍以及软件下载,看这里