如果看不到下边的flash,请更新flash player到最新版本。

利用AGAL实现旧照片效果,大家可以对照一下之前一篇文章,关于图像处理(pixelbender)。硬件处理肯定会更快,但这里无法表现出来,毕竟图片就这么小。拖拉进度条,可以设置照片旧的程度。

package
{
import com.adobe.utils.AGALMiniAssembler;
import com.bit101.components.HSlider;
import com.bit101.components.PushButton; import flash.display.Bitmap;
import flash.display.BitmapData;
import flash.display.Loader;
import flash.display.Sprite;
import flash.display.Stage3D;
import flash.display.StageAlign;
import flash.display.StageScaleMode;
import flash.display3D.Context3D;
import flash.display3D.IndexBuffer3D;
import flash.display3D.Program3D;
import flash.display3D.VertexBuffer3D;
import flash.display3D.textures.Texture;
import flash.events.Event;
import flash.geom.Matrix;
import flash.geom.Matrix3D;
import flash.net.FileFilter;
import flash.net.FileReference;
import flash.utils.ByteArray; import net.hires.debug.Stats; /**
* 借用了boycy815的代码框架
* @author kenkozheng
*/
[SWF(frameRate="60")]
public class AGAL_Filter extends Sprite
{
private const WIDTH:Number = 512;
private const HEIGHT:Number = 512; //stage3d五巨头
private var _stage3d:Stage3D;
private var _context3d:Context3D;
private var _program3d:Program3D;
private var _index:IndexBuffer3D;
private var _vertex:VertexBuffer3D;
private var _texture:Texture; [Embed(source=("4.jpg"))]
private var ImageSource:Class; private var _vertexProgram:String = "mov op, va0\n" +
"mov v0, va1"; //传递给片段shader坐标值 private var _fragmentProgram:String = "tex ft1, v0, fs0<2d,linear,nomip>\n" +
"m44 ft2, ft1, fc1\n" + //颜色变换
"mul ft2, ft2, fc0.x\n" + //效果图跟原图做multiply,向量float4 * float = float4,类似PixelBender
"mul ft1, ft1, fc0.y\n" +
"add ft2, ft2, ft1\n" +
"mov oc, ft2"; public function AGAL_Filter():void
{
if (stage) init();
else addEventListener(Event.ADDED_TO_STAGE, init);
} private function init(e:Event = null):void
{
stage.scaleMode = StageScaleMode.NO_SCALE;
stage.align = StageAlign.TOP_LEFT;
removeEventListener(Event.ADDED_TO_STAGE, init);
_stage3d = stage.stage3Ds[0];
_stage3d.addEventListener(Event.CONTEXT3D_CREATE, onCreate);
_stage3d.requestContext3D();
addChild(new Stats());
} private function onCreate(e:Event):void
{
e.target.removeEventListener(Event.CONTEXT3D_CREATE, onCreate); _context3d = _stage3d.context3D;
_context3d.enableErrorChecking = true; var agal:AGALMiniAssembler = new AGALMiniAssembler(); var vp:ByteArray = agal.assemble("vertex", _vertexProgram);
var fp:ByteArray = agal.assemble("fragment", _fragmentProgram);
_program3d = _context3d.createProgram();
_program3d.upload(vp, fp);
_context3d.setProgram(_program3d); _context3d.configureBackBuffer(WIDTH, HEIGHT, 0, false);
_context3d.setBlendFactors("one", "zero");
_context3d.setCulling("back"); //两个三角形拼成平面
_index = _context3d.createIndexBuffer(6);
_index.uploadFromVector(new<uint>[0, 1, 2, 0, 2, 3], 0, 6); _vertex = _context3d.createVertexBuffer(4, 4);
//这是由于纹理的坐标原点是左上角,y轴向下,最大值为1最小值为0
//而顶点的坐标原点则是在舞台中央,而且y轴向上,最大值为1最小值为-1
//那么(-1,-1)点对应的纹理就是(0,1)
_vertex.uploadFromVector(new<Number>[
//x, y, u, v
-1, -1, 0, 1,
-1, 1, 0, 0,
1, 1, 1, 0,
1, -1, 1, 1], 0, 4);
_context3d.setVertexBufferAt(0, _vertex, 0, "float2"); //xy坐标
_context3d.setVertexBufferAt(1, _vertex, 2, "float2"); //uv坐标 //纹理位图
var bt:Bitmap = Bitmap(new ImageSource());
var btmap:BitmapData = new BitmapData(WIDTH, HEIGHT);
btmap.draw(bt); //上传纹理
_texture = _context3d.createTexture(btmap.width, btmap.height, "bgra", false);
_texture.uploadFromBitmapData(btmap);
_context3d.setTextureAt(0, _texture);
//multiple比例
_context3d.setProgramConstantsFromVector("fragment", 0, new<Number>[1, 0, 0, 0]);
//颜色矩阵
_context3d.setProgramConstantsFromMatrix("fragment", 1, new Matrix3D(new <Number>[
0.393, 0.768, 0.189, 0,
0.349, 0.686, 0.168, 0,
0.272, 0.534, 0.13, 0,
0, 0, 0, 1
])); _context3d.clear(0, 0, 0, 0);
_context3d.drawTriangles(_index);
_context3d.present(); start();
} private function start():void
{
new PushButton(this, 282, 515, "change", onUpload);
new HSlider(this, 392, 520, onBar).setSliderParams(0, 1, 1);
} private function onBar(e:Event):void
{
var v:Number = e.currentTarget.value;
_context3d.setProgramConstantsFromVector("fragment", 0, new<Number>[v, 1-v, 0, 0]);
_context3d.clear(0, 0, 0, 0);
_context3d.drawTriangles(_index);
_context3d.present();
} private function onUpload(e:Event):void
{
var fr:FileReference = new FileReference();
fr.addEventListener(Event.SELECT, onSelect);
fr.browse([new FileFilter("jpg/png", "*.jpg;*.png")]);
} private function onSelect(e:Event):void
{
e.currentTarget.removeEventListener(Event.SELECT, onSelect);
e.currentTarget.addEventListener(Event.COMPLETE, onComplete);
e.currentTarget.addEventListener(Event.OPEN, function(e:Event):void { } );
e.currentTarget.load();
} private function onComplete(e:Event):void
{
e.currentTarget.removeEventListener(Event.COMPLETE, onComplete);
var loader:Loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loaderOnComplete);
loader.loadBytes(e.currentTarget.data);
} private function loaderOnComplete(e:Event):void
{
e.currentTarget.removeEventListener(Event.COMPLETE, loaderOnComplete); var btmap:BitmapData = new BitmapData(WIDTH, HEIGHT);
var scale:Number = Math.max(WIDTH/e.currentTarget.loader.width, HEIGHT/e.currentTarget.loader.height);
btmap.draw(e.currentTarget.loader, new Matrix(scale, 0, 0, scale), null, null, null, true); _texture.uploadFromBitmapData(btmap); _context3d.clear(0, 0, 0, 0);
_context3d.drawTriangles(_index);
_context3d.present();
}
} }

Stage3d AGAL GPU处理照片 旧照片效果 sepia || pixelbender的更多相关文章

  1. Android ColorMatrix类图像颜色处理-黑白老照片、泛黄旧照片、高对比度等效果

    在Android中,对图像进行颜色方面的处理,如黑白老照片.泛黄旧照片.高对比度.低饱和度等效果,都可以通过使用颜色矩阵(ColorMatrix)来实现. 1.颜色矩阵(ColorMatrix)介绍 ...

  2. 微软开源的 AI 工具,让旧照片焕发新生

    原文地址:Bringing Old Photos Back to Life 原文作者:Ziyu Wan 译者 & 校正:HelloGitHub-小鱼干 & 鸭鸭 写在前面 在 GitH ...

  3. css: 照片有如层叠效果

    显示上面照片效果css <!DOCTYPE html> <!--headTrap<body></body><head></head>& ...

  4. 使用CoreAnimation 实现相机拍摄照片之后动画效果

    废话不多说,先看上效果,由于动画录制的时候帧率限制,只能将动画放慢了进行录制,更容易看到效果 这是点击开始之后代码 -(IBAction)btnStartClick:(id)sender { CABa ...

  5. Photoshop将普通照片快速制作二次元漫画风格效果

    今天为大家分享Photoshop将普通照片快速制作二次元漫画风格效果,教程很不错,对于喜欢漫画的朋友可以参考本文,希望能对大家有所帮助! 一提到日本动画电影,大家第一印象肯定是宫崎骏,但是日本除了宫崎 ...

  6. 3d照片环效果(修改版--添加了x轴y轴双向转动和修复模糊度的bug)

    今天用用前两天总结的css3新效果写了一个3d照片环的效果,其中还有些bug大家可以看一看,一起改进. <!DOCTYPE html> <html lang="en&quo ...

  7. Stage3d 由浅到深理解AGAL的管线vertex shader和fragment shader || 简易教程 学习心得 AGAL 非常非常好的入门文章

    Everyday Stage3D (一) Everyday Stage3D (二) Triangle Everyday Stage3D (三) AGAL的基本概念 Everyday Stage3D ( ...

  8. 一定要记住这20种PS技术!!!会让你的照片美的不行!!!

    一种简单的数码照片后期润饰 1 打开图片,执行色像/饱和度(-40)降低饱和度. 2 新建一图层,将图层模式改为柔光,用画笔工具将需要润饰的部分画几下,这里可以利用色板方便的提取颜色 3 图片色彩过渡 ...

  9. photoshop快速把新照片制作成老照片教学

    原图 步骤1 在photoshop中找开需要处理的图片,Ctrl+J复制图片,得到图片1. 步骤2 单击图层面板底部的创建新的填充或调整图层图标,添加色调/饱和度调整图层.调整它的饱合度和明度. 步骤 ...

随机推荐

  1. c# 四舍五入、上取整、下取整

    在处理一些数据时,我们希望能用“四舍五入”法实现,但是C#采用的是“四舍六入五成双”的方法,如下面的例子,就是用“四舍六入五成双”得到的结果: double d1 = Math.Round(1.25, ...

  2. Delphi-Cross-Socket

    Delphi-Cross-Socket GITHUB:https://github.com/winddriver/Delphi-Cross-Socket # Delphi 跨平台 Socket 通讯库 ...

  3. 【C#高级编程】笔记之核心C#

    Main()方法 每一个C#可执行文件(如控制台程序.Windows程序和Windows服务)都必须有一个入口点——Main()方法(注意M大写). 这个方法必须是类或静态方法,并且返回类型必须是in ...

  4. Windows下编译memcached-1.4.5(32bit和64bit)

    1.简介 Memcached 是一个高性能的分布式内存对象缓存系统.它通过将数据缓存在内存中来减少对数据库和文件系统的访问,减轻数据库及操作系统的负担,提高应用系统的速度. 目前已经很多系统应用了me ...

  5. JSON.parse()和JSON.stringify()方法

    parse用于从一个字符串中解析出json对象,如 var str = '{"name":"huangxiaojian","age":&qu ...

  6. 3D屏保:N皇后

    前几天园子里有人发表关于8皇后的算法.只有代码,没有能运行的DEMO多枯燥.于是我这两天抽时间写了个N皇后的屏保程序.程序启动后会从4皇后到14皇后显示其所有排列,每隔0.5秒自动切换一次.按下空格键 ...

  7. 我的SQL里哪个语句占用的CPU最多?

    可以使用下面的语句来得到 SELECT SUBSTRING(qt.TEXT, (qs.statement_start_offset/2)+1, ( (CASE qs.statement_end_off ...

  8. 【WCF】HTTP 无法注册 URL 进程,不具有此命名空间的访问权限

    背景   如题,在运行WCF宿主主机时,出现了问题.   捕获异常为:HTTP 无法注册 URL http://+:8000/WCF/.进程不具有此命名空间的访问权限(有关详细信息,请参见 http: ...

  9. maven 将jar 下载到工程当前目录下

    在 pom.xml 的目录下,运行cmd命令 : call mvn -f pom.xml dependency:copy-dependencies 然后在同一目录下出现文件夹target,内容就是ja ...

  10. 给开发者准备的 10 款最好的 jQuery 日历插件[转]

    这篇文章介绍的是 10 款最棒而且又很有用的 jQuery 日历插件,允许开发者们把这些漂亮的日历插件结合到自己的网站中.这些日历插件易用性都很强,轻轻松松的就可以把漂亮的日历插件装饰到你的网站了.希 ...