(原)使用as3corelib的PNGEncoder保存屏幕为PNG并上传到服务器

本文介绍如何使用AS3创建屏幕截图并通过PHP将其上传至服务器。重点在于解决因注册点不同导致的截图不完整问题,通过矩阵平移确保完整截图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

程序很少,但功能强大,呵呵:)

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点开始绘制的。

       upload

此时,为了能够将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);
}

好了,现在生成的图片再看一下就没有问题了:)

       upload

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值