[翻译]ActionScript 3 Jpeg Encoder实例:保存flash中的图片 - [flash开发]
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://madinsect.blogbus.com/logs/24042051.html
有了actionscript3,有许多不可思议的图片操作都可以实现。能把flash中的显示对象转换成一张jpeg图片就是其中之一,这要感谢在AS3 Core Library(一个as3开源库)中所提供的JPEG格式编译类,有了它,要实现前面的那个构想将变得十分简单。在下文中,我将向你展示如何编写一个flash,使他能够把movieclip转换为一张jpeg图片并可以下载到用户电脑。
为了给你一个程序的大体概念,请试试下面的这个画图板。
首先要做的重要准备
在我们开始之前,取保你已经下载了ActionScript 3 Core Library。这个核心库包涵了许多类和功能模块,他们提供了诸如MD5,日期格式化,图像编码等功能(这里只列举了其中几个)。当你获得了这个库之后,你只需要把它放到你的类文件夹中,就可以使用它提供的这些功能了。现在我们可以导入JPGEncoder这个类了。
import com.adobe.images.JPGEncoder;
编译一个MovieClip
在这个例子中,我们假设我们感兴趣的那个MovieClip名为sketch_mc,为了能使用JPGEncoder进行操作,我们需要先把MovieClip转换为一个Bitmap对象。要实现这一步,我们将使用到BitmapData这个类。该类的构造函数需要两个参数,宽和高。因为我们想要这张jpeg图片的大小和sketch_mc的大小一样,所以我们用sketch_mc的宽高属性。然后通过传递sketch_mc参数给draw方法,我们的MovieClip就转换为一个Bitmap对象了。
import com.adobe.images.JPGEncoder;
var jpgSource:BitmapData = new BitmapData (sketch_mc.width, sketch_mc.height);
jpgSource.draw(sketch_mc);
现在sketch_mc的图像已经有位图实例了,我们就可以使用JPGEncoder了。在创建这个类的一个新实例的时候,你可以通过传递1-100的数字参数来设置图片压缩的等级。接下来我们来创建jpeg图片,调用encode方法,并且把上面的位图实例作为参数传递进去。该方法将以ByteArray的数据格式返回jpeg,可见这个类和AS3中其他操作二进制数据的类一样简单方便。
import com.adobe.images.JPGEncoder;
var jpgSource:BitmapData = new BitmapData (sketch_mc.width, sketch_mc.height);
jpgSource.draw(sketch_mc);
var jpgEncoder:JPGEncoder = new JPGEncoder(85);
var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);
从Flash Player到硬盘
ActionScript 3已经完成了所有将MovieClip转换为jpeg的必要工作,但是现在还需要一些小步骤来实习图片的下载。为此我们需要用URLRequest这个类把我们得到的二进制数据传递给服务器端的脚步。因为我们post的是二进制数据,所以必须设置content-type为“application/octet-stream”。当然,当图片被下载的时候它还需要一个名字,所以我们同样需要把这个参数作为查询字符床也传递给服务器端的脚步。
import com.adobe.images.JPGEncoder;
var jpgSource:BitmapData = new BitmapData (sketch_mc.width, sketch_mc.height);
jpgSource.draw(sketch_mc);
var jpgEncoder:JPGEncoder = new JPGEncoder(85);
var jpgStream:ByteArray = jpgEncoder.encode(jpgSource);
var header:URLRequestHeader = new URLRequestHeader("Content-type", "application/octet-stream");
var jpgURLRequest:URLRequest = new URLRequest("jpg_encoder_download.php?name=sketch.jpg");
jpgURLRequest.requestHeaders.push(header);
jpgURLRequest.method = URLRequestMethod.POST;
jpgURLRequest.data = jpgStream;
navigateToURL(jpgURLRequest, "_blank");
下面是我们的jpg数据将要post去的php页面的脚步。我选择php作为例子,但其实任何服务器端的脚步都是可以的。
if (isset($GLOBALS["HTTP_RAW_POST_DATA"]))
{
// get bytearray
$jpg = $GLOBALS["HTTP_RAW_POST_DATA"];
// add headers for download dialog-box
header(’Content-Type: image/jpeg’);
header(”Content-Disposition: attachment; filename=”.$_GET['name']);
echo $jpg;
}