flash+php截图后保存图片

January 19th, 2009

as2时代要实现该功能只有在本地draw完bitmap后,把所有widthxheight的图片都储存到数组里然后post给php,php通过gd库来生成,虽然可以不过效率就…一张120×90的图就够flash运算半天了.
as3要实现这个功能虽然还要借助php,但是只是借助php把图片数据给echo出来而已.图片生成关键步骤都在客户端进行了.
另外还需要adobe官方的as3corelib包.

客户端:

import com.adobe.images.JPGEncoder;
import flash.display.BitmapData;
import flash.display.Sprite;
import flash.net.URLLoader;
import flash.net.URLRequest;
import flash.net.URLRequestHeader;
import flash.net.navigateToURL;
import flash.utils.ByteArray;
 
//画位图数据
var jpgSource:BitmapData = new BitmapData (picture.width, picture.height);
jpgSource.draw(picture);
//生成编码容器
var jpgEncoder:JPGEncoder = new JPGEncoder(95);
//将位图数据编码到容器内成为ByteArray流
var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);
//压缩ByteArray流
jpgStream.compress();
//添加stream的header请求
var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
var jpgURLRequest:URLRequest = new URLRequest("save.php");
jpgURLRequest.requestHeaders.push(header);
jpgURLRequest.method = "POST";
jpgURLRequest.data = jpgStream;
//推送图片数据到服务器端
navigateToURL(jpgURLRequest, "_blank");

服务器端:

<?php
$jpg = gzuncompress($GLOBALS["HTTP_RAW_POST_DATA"]);
header("Content-Type: image/jpeg");
echo $jpg;
?>

搞了一个as3的开源项目到google code上

December 24th, 2008

只是为了自己备份下写过的功能而已,如果谁有兴趣也可以去checkout下来.注释和文档很完整的.
名叫astrois,会不断更新:
http://code.google.com/p/astrois/
IE支持在线文档地址:
http://astrois.googlecode.com/svn/trunk/docs/index.html

flash里的背景平铺

December 1st, 2008

其实有很多方法实现,这里就按播放器的版本从低到高的实现方法来说好了:

1.载入位图后duplicateMovieClip
如果播放器必须发布成<=7,就只能使用以下方法,原理就是载入一张位图,然后遍历duplicateMovieClip到舞台上。

  1. var a:Number = Math.floor(Stage.width / img_width);
  2. var b:Number = Math.floor(Stage.height / img_height);
  3. for (var i:Number = 0; i<=b; i++) {
  4.     for (var j:Number = 0; j<=a; j++) {
  5.         bg_mc.duplicateMovieClip("bg_"+i+"_"+j, bg_mc.getNextHighestDepth(), {_x:j*img_width, _y:i*img_height});
  6.     }
  7. }

2.载入位图draw后,生成bitmap平铺。
如果播放器可以发布成8,就可以使用以下方法。其实原理和1差不多,不过8开始引入了Bitmap,因为平铺的是bitmap,所以肯定比1更节约资源。

  1. var bmpData:BitmapData = new BitmapData(img_width, img_height);
  2. bmpData.draw(img_target);
  3. for(var i:Number = 0;i<Math.ceil(h/img_height);i++)
  4. {
  5.      for(var j:Number = 0;j<Math.ceil(w/img_width);j++)
  6.      {
  7.          var bmp:Bitmap = new Bitmap(bmpData);
  8.          bmp.y = img_height*i;
  9.          bmp.x = img_width*j;
  10.      }
  11. }

3.载入位图draw后,通过位图填充功能填充graphic子对象。
如果播放器可以发布成9,就可以使用以下方法。9开始引入了位图填充,所以根本不用考虑什么平铺,直接就和Photoshop里的自定义图案填充一样方便。

  1. var bmpData:BitmapData = new BitmapData(img_width, img_height);
  2. bmpData.draw(img_target);
  3. var graphic:Graphics = shell.graphics;
  4. graphic.beginBitmapFill(bmpData);
  5. graphic.drawRect(0,0,w,h);
  6. graphic.endFill();

as2 对象查看函数

August 13th, 2008
  1. function traceObject(obj:Object, indent:Number):Void {
  2.     indent = indent ? indent : 0;
  3.     var indentString:String = "";
  4.     var i:Number;
  5.     var prop:String;
  6.     var val;
  7.     for (i=0; i<indent; i++) {
  8.         indentString += " ";
  9.     }
  10.     for (prop in obj) {
  11.         val = obj[prop];
  12.         if (typeof (val) == "object") {
  13.             trace(indentString+" "+prop+": [Object]");
  14.             traceObject(val, indent+2);
  15.         } else {
  16.             trace(indentString+" "+prop+": "+val);
  17.         }
  18.     }
  19. }

方便以后用。

发布成fp8++的swf中利用bitmapData平滑显示图片

August 5th, 2008

其实在flash7和更早的版本只要用_quality = “HIGH”或”BEST”就可以控制图片平滑显示了,不过这样有个缺点,所有场景和元素都会平滑,严重消耗资源。
在flash8里adobe不让通过调整_quality来平滑图片了,可以利用bitmapData来替换。
在图片的MovieClipLoader加载完毕的时候:

  1. import flash.display.BitmapData;
  2. function __onLoadInit(target:MovieClip):Void {
  3.     var bd:BitmapData = new flash.display.BitmapData(target._width, target._height);
  4.     bd.draw(target);
  5.     target.attachBitmap(bd, 1, "auto", true);
  6. }

然后,这个target就被平滑的bitmapData替换掉了。
不过adobe似乎忘记了他对bitmapData的安全限制,fp9以下的客户端根本无法跨域draw到bitmapData,即使是fp9 plus,也要去loadPolicyFile,所以当图片分布在很多台服务器上的时候,根本没有什么好的办法解决这个问题,总不至于每打开一个app就遍历去加载几十个crossdomain.xml吧。
你干脆就不要让MovieClipLoader加载他出来,这样就没什么安全性问题了,这个世界也清净了,既然能加载出来,又不让draw,自相矛盾的啊,倒不如用回7算了。

fdt升级后非常郁闷

October 23rd, 2007

每次build项目的时候都会出现假死,有时候就变成真死了。搞得每次切换项目后都提心吊胆的。
记得之前的版本不是这样的啊,是后台自动build,而且不会影响到前面的操作。准备用一段时间后再换回旧的试试感觉。
更郁闷的是,操作快一点经常会导致eclipse假死并被down掉(当然,我没有开自动build)。
总之就是不如之前的版本顺利,倒是反而用flex builder写Focuswing的过程中,一次都没有出现过问题。
所以我感觉,如果写as2的话,没什么必要升级fdt。如果写as3的话,用fb好了。

用AsWing开发了一个饭否桌面应用-Focuswing

September 9th, 2007

下载swf文件:focuswing_1.0.rar
下载exe文件:focuswing_1.0.exe

采用as3,mvc模式开发。刚开始不习惯这种模式,用多了突然会觉得很顺手。
饭否:应该就不用介绍了吧
AsWing:aswing是一个开源的flash GUI框架,布局和架构思路类似javaswing。之前的A2版本由于只支持mtasc编译方式,所以在配置和使用上都略显复杂。不过目前的A3版本既可以支持Flex开发,也支持Flash编译方式开发,配置和使用几乎没有门槛。
更值得说一下的是,这个框架是由国人自己开发的,在国内这样的互联网环境下能有这样始终保持生命力的开源项目诞生和存在,还是满有意义的。
一直认为flex的组件以及mxml的编写方式局限性很大。虽然AsWing与flex的组件不具有可比性。不过AsWing显然提供了一种更为纯净的方式来使用as3。

关于as3事件的笔记

August 17th, 2007

as2时代直接在dispatchEvent的时候跟上想跟的参数就可以了,as3增加了一个Event的继承类来承担其中的信息传递,不过看书看到关键时刻居然就没有了。于是笔记一下类实例怎么向外发送事件和传递参数,来点实用的。
发送事件的Guest,在Guest内发送”do_b”的Event:

  1. var e:GuestEvent = new GuestEvent(GuestEvent.DO_B);
  2. e.args = {author:"hirokimo",time:"21:10"};
  3. this.dispatchEvent(e);

这时候为了传递参数,使用一个继承Event的自定义事件类GuestEvent:

  1. package
  2. {
  3.     import flash.events.Event;   
  4.     public class GuestEvent extends Event
  5.     {
  6.         public static const DO_A:String = "do_a";
  7.         public static const DO_B:String = "do_b";
  8.         public static const DO_C:String = "do_c";      
  9.         public var args:*;   
  10.         public function GuestEvent(_type:String)
  11.         {
  12.             super(_type);
  13.         }
  14.     }
  15. }

最后,在类外面添加侦听和接收的地方:

  1. package
  2. {
  3.     public class EventTest
  4.     {
  5.         public function EventTest()
  6.         {
  7.             var guest:Guest = new Guest();
  8.             guest.addEventListener(GuestEvent.DO_B,handleB);
  9.         }
  10.         private function handleB(e:GuestEvent):void
  11.         {
  12.             trace("author:"+e.args.author
  13.             +" time:"+e.args.time);
  14.             //author:hirokimo time:21:10
  15.         }
  16.     }
  17. }

大功告成,之后就可以顺利的发送事件参数了。
不过有一点值得注意:Guest类里有时需要在初始化后直接dispatch一个Event出来,这时候因为外部addEventListener动作还没有完成,listener是收不到事件的。
这个问题很容易被忽略,如果一定要这么做,可以:
1.Guest初始化后timer几百毫秒再dispatch 或者
2.外面addEventListener完之后,主动调guest.xxx来发送。

as3 读书笔记

August 5th, 2007

仅仅是笔记 没有讨论问题 大家请略过

1.用正则来replace字符串

  1. var str:String = "above thE cloud,around The shadow.";
  2. var pattern:RegExp = /the/ig;
  3. trace(str.replace(pattern, "my"));
  4. //above my cloud,around my shadow.

2.数组深度copy

  1. private function clone(source:Object):*
  2. { 
  3.     var myBA:ByteArray = new ByteArray();
  4.     myBA.writeObject(source);
  5.     myBA.position = 0;
  6.     return(myBA.readObject());
  7. }

3.遍历Object,这个和as3没什么关系,不过经常用到。

  1. private function traceObject(obj:Object, indent:uint = 0):void
  2. {
  3.     var indentString:String = "";
  4.     var i:uint;
  5.     var prop:String;
  6.     var val:*;
  7.     for (i = 0; i < indent; i++)
  8.     {
  9.         indentString += "\t";
  10.     }
  11.     for (prop in obj)
  12.     {
  13.         val = obj[prop];
  14.         if (typeof(val) == "object") 
  15.         {
  16.             trace(indentString + " " + prop + ": [Object]");
  17.             traceObject(val, indent + 1);
  18.         }
  19.         else
  20.         {
  21.             trace(indentString + " " + prop + ": " + val);
  22.         }
  23.     }
  24. }

开始用flex builder来as3

July 29th, 2007

一直在找借口,要等到fdt3出来后才开始学as3,没想到fdt3的alpha就已经出来了-_-,下载了后总的来说,感觉已经失去了as2时代的优势了,抛开没有好的一个trace机制来说,flex builder的功能也完全可以取代之了。
不过还是会一直用它来写as2代码,卡卡。
关于fb3beta,试用感觉还不错,把快捷debug设置设成和flash里一样,然后在调试台里看信息。其实和写java的感觉差不多,怪不得java程序员那么容易上手as3-_-。
关于怎么设置的和flash里一样手感,可以参照eidiot同学的文章。
here:使用Flex Builder开发AS3程序
然后,总算可以开始了,虽然总比别人慢一拍。
至于flex组件和mxml编码方式,暂时不打算涉及,这种编码方式实在是满奇怪的。