flash里面,位图动态缩小,如何消除锯齿?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flash里面,位图动态缩小,如何消除锯齿?相关的知识,希望对你有一定的参考价值。
一个大的jpg图片,导入到flash之后,用as2的图形组件draw这个图片,然后在缩小,此时产生锯齿。
请问如何做,才能不产生锯齿呢?需要换算法吗?
请教各位大大。
smooth参数无效果。。。
整个flash的质量选择为 中
可以用MovieClip.attachBitmap中的一个smooth参数的设置,来进行平滑处理。具体的自己查看帮助
---------
smooth设置为true
---------------
import flash.display.BitmapData;
/*************加载******************/
var container1:MovieClip = createEmptyMovieClip("container1", getNextHighestDepth());
var container2:MovieClip = createEmptyMovieClip("container2", getNextHighestDepth());
var loader1:MovieClipLoader = new MovieClipLoader();
var loader2:MovieClipLoader = new MovieClipLoader();
var obj:Object = new Object();
obj.onLoadInit = function(target:MovieClip)
trace("onLoadInit");
loaderDispose(target);
;
loader1.addListener(obj);
loader1.loadClip("2.jpg", container1);
loader2.addListener(obj);
loader2.loadClip("2.jpg", container2);
/**********图片处理***************/
var bitmapLoader1:MovieClip = createEmptyMovieClip("Bloader1", getNextHighestDepth());
var bitmapLoader2:MovieClip = createEmptyMovieClip("Bloader2", getNextHighestDepth());
var bitmap1:BitmapData;
var bitmap2:BitmapData;
function loaderDispose(mc:MovieClip)
mc._visible = false;
/*******不平滑*******/
if (mc._name == "container1")
bitmap1 = new BitmapData(mc._width, mc._height, true, 0x00FFFFFF);
bitmap1.draw(mc);
bitmapLoader1.attachBitmap(bitmap1, 0);
bitmapLoader1._x = -50;
bitmapLoader1._xscale = bitmapLoader1._yscale=250;
else
/******平滑处理*******/
bitmap2 = new BitmapData(mc._width, mc._height, true, 0x00FFFFFF);
bitmap2.draw(mc);
bitmapLoader2.attachBitmap(bitmap2, 1, "auto", true);
//主要就是这个smooth参数,true表示平滑
bitmapLoader1._x = -50;
bitmapLoader2._y = 300;
bitmapLoader2._xscale = bitmapLoader2._yscale=250;
看看这个代码吧,放张2.jpg试试 参考技术A smooth应该是有效果的,我以前也碰到过,不过你要注意要每次改变了位图内容之后都要设置一下smooth 参考技术B 貌似失量图才能做到吧.
贴图问题,opengl,linux,windows,消除锯齿,摩尔纹,yuv 还是 rgb
1 消除锯齿和摩尔纹
windows下使用d3d是很方便的,基本不用设置很多东西,就可以做到,所以windows上最好使用d3d。但是linux上有所不同。
摩尔条纹是两条线或两个物体之间以恒定的角度和频率发生干涉的视觉结果,而锯齿是在缩小的情况下,画面计算引起,这两个事物都必须消除。
使用opengl 在linux 上做opengl 和 windows上有所不同吗,事实上,是这样的,我们在渲染的时候,如何做到反锯齿,反摩尔纹,其实都是要了解和掌握最基础的底层相应的知识体系,才能做到比较好的状态,监控贴图也是一个麻烦的事情,特别注意的是画面缩小的情况,如果我们熟悉ffmpeg,就知道ffmpeg在缩小算法上做得很好,可以消除很多锯齿和摩尔纹。
请看下面这幅图:正好是同向的方块和线条组成,这种情况锯齿更加严重。
这个很恶劣,主要是锯齿和摩尔效应对眼睛的刺激比较大,这样除了让普通的观察者感到无法接受,最重要的是图像会产生误差,下面使用mipmap去过滤图像
发现好了一点,并不是非常好
下面使用mipmap和各项异性过滤,会更好一点
使用linear 和mipmap 与各项异性过滤
达到效果!
linux 和windows的不同之处以及linux的问题
知识讲完,难道linux和windows下真的有所不同?那么答案在这里:代码是一样的,不一样的是驱动,linux下开源驱动,闭源驱动,opengl版本不同,还有半闭源驱动,以及nvidia下是否安装cuda,最终影响画面的总共有以下几点:
1 画面分辨率
2 如果是远程画面还有码率问题
3 opengl 版本
4 驱动
5 a卡的驱动和n卡驱动不同
6 cuda 问题
7 linux下bug问题(大都是国产操作系统,不言明了)
我举个例子,我们选取RGBA32 和RGB24 和 yuv420 去贴图的时候,应该选取哪一个?
这个问题比较麻烦,但不复杂,说亮点:
分辨率不同,选取RGB32 和 yuv 应该不同
驱动不同,选取RGB32 和 yuv 不同
opengl版本不同,选取不同,
显卡不同,选取不同
那么综合以上所述,应该选取哪一样比较合适,这个实际上要经过许多测试的,在windows上,不用担心这类问题,因为驱动肯定是合适的,接下去就是选取opengl 的版本,当然使用vulkan 是另外一回事,所以windows上我们可以这么做:
windows
小分辨率: 使用RGB32,为什么不使用RGB24,虽然RGB24的数据量更小,不过大部分显卡是为了游戏而生,所使用的颜色对齐一致为RGBA,所以反而效率要高
大分辨率:使用yuv420,数据量过了瓶颈,yuv420的数据量小很多,效率反而高了
linux :
不知道怎么做:选取RGB32, 放大缩小使用linear 过滤
知道怎么做: 选取两种方式,用户可以修改方式,放大缩小使用linear 和mipmap
知道自己使用的是纯的闭源驱动,是配置的专家,使用yuv420 和 硬件解码结合,使用linear 和mipmap过滤和各项异性过滤。
以上只是建议,肯定有更好的方式。
比如windows不使用opengl,使用direct3d是更好的,使用d3d11 就好了,如果有兴趣,当然可以使用dx12,考虑的是兼容问题,那就直接使用d3d。
以上是关于flash里面,位图动态缩小,如何消除锯齿?的主要内容,如果未能解决你的问题,请参考以下文章
将文本创建为位图的工具(消除锯齿文本、自定义间距、透明背景)