程序很少,但功能强大,呵呵:)
AS3程序:
package { import flash.display.BitmapData; import flash.display.Sprite; import flash.events.MouseEvent; import flash.net.URLLoader; import flash.net.URLRequest; import flash.net.URLRequestMethod; import flash.ui.Mouse; import flash.utils.ByteArray; public class SaveScreen extends Sprite { private var sprite : Sprite; public function SaveScreen() { sprite = new Sprite(); sprite.graphics.beginFill(0x000000); sprite.graphics.drawRect(0,0,100,100);//改成drawRect(10,10,100,100)会看到白边 sprite.graphics.endFill(); this.addChild(sprite); sprite.addEventListener(MouseEvent.CLICK, this.onClick); } private function onClick(event : MouseEvent) : void { var bitmapData : BitmapData = new BitmapData(sprite.width, sprite.height); bitmapData.draw(sprite); var jpgBytes:ByteArray = PNGEncoder.encode(bitmapData); var req:URLRequest = new URLRequest("binaryWrite.php"); req.data = jpgBytes; req.method = URLRequestMethod.POST; req.contentType = 'application/octet-stream'; var loader:URLLoader = new URLLoader(); loader.load(req); } } }
PHP服务器端的接受数据并保存的程序binaryWrite.php:
<?php $data = file_get_contents('php://input'); echo file_put_contents("upload.png",$data); ?>
但在AS程序中需要注意一点,PNGEncoder是从显示对象的注册点开始根据显示对象的宽度和高度来创建图片,所以如果你不是从注册点开始绘制的图形,可能不会被包含在生成的图片中。例如上面的AS程序中如果把sprite.graphics.drawRect(0,0,100,100);改成sprite.graphics.drawRect(10,10,100,100);,那么生成的图片如下,原因是sprite的注册点在0,0点,而sprite内部绘制的时候是从10,10点开始绘制的。
此时,为了能够将sprite中的真实内容全部生成图片,可以在bitmapData.draw(sprite);中添加第二个参数,通过一个矩阵将图片在构造bitmapData的时候进行平移,将全部的内容移动到sprite中。
private function onClick(event : MouseEvent) : void { var bitmapData : BitmapData = new BitmapData(sprite.width, sprite.height); //声明一个矩阵,并平移你需要的距离 var m : Matrix = new Matrix(); m.translate(-10,-10); //在向BitmapData中绘制sprite时,添加矩阵进行转换 bitmapData.draw(sprite,m); var jpgBytes:ByteArray = PNGEncoder.encode(bitmapData); var req:URLRequest = new URLRequest("binaryWrite.php"); req.data = jpgBytes; req.method = URLRequestMethod.POST; req.contentType = 'application/octet-stream'; var loader:URLLoader = new URLLoader(); loader.load(req); }
好了,现在生成的图片再看一下就没有问题了:)