移动端canvas抗锯齿

未抗锯齿效果图:

加入抗锯齿代码效果:

var Game = function(){
        var H = document.documentElement.clientHeight || document.body.clientHeight;
        var W = document.documentElement.clientWidth || document.body.clientWidth;
        this.canvas = document.getElementById("canvas");
        this.context = this.canvas.getContext("2d");
        /*主要js*/
        if (window.devicePixelRatio) {
            this.canvas.style.width = W + "px";
            this.canvas.style.height = H + "px";
            this.canvas.width = W * window.devicePixelRatio;        //此处以倍数最佳
            this.canvas.height = H * window.devicePixelRatio;        //此处以倍数最佳
            this.context.scale(window.devicePixelRatio, window.devicePixelRatio);        //此处以倍数最佳
        }else{
            this.canvas.width = W;
            this.canvas.height = H;
        }

// 倍数代码示例

if (window.devicePixelRatio) {
    this.canvas.style.width = W + "px";
    this.canvas.style.height = H + "px";
    this.canvas.width = W * 2 * window.devicePixelRatio;
    this.canvas.height = H * 2 * window.devicePixelRatio;
    this.context.scale(window.devicePixelRatio*2, window.devicePixelRatio*2);}








//demo代码

<!DOCTYPE html>
<html>
    <head>
        <!--<meta content="width=device-width,initial-scale=1.0,maximum-scale=1.0,user-scalable=no" name="viewport">-->
        <meta content="width=750,user-scalable=no" name="viewport">
        <meta name="format-detection" content="telephone=no" />
        <meta charset="utf-8" />
        <script type="text/javascript" src="js/jquery-2.1.3.min.js" ></script>
        <script type="text/javascript" src="js/public.js" ></script>
        <link rel="stylesheet" href="css/style.css" />
        <title></title>
    </head>
    <body>
        <section class="page">
            <canvas id="canvas"></canvas>
        </section>
    </body>
</html>
<script type="text/javascript">
    var Game = function(){
        var H = document.documentElement.clientHeight || document.body.clientHeight;
        var W = document.documentElement.clientWidth || document.body.clientWidth;
        this.canvas = document.getElementById("canvas");
        this.context = this.canvas.getContext("2d");

        if (window.devicePixelRatio) {
            this.canvas.style.width = W + "px";
            this.canvas.style.height = H + "px";
            this.canvas.width = W*2 * window.devicePixelRatio;
            this.canvas.height = H*2 * window.devicePixelRatio;
            this.context.scale(window.devicePixelRatio*2, window.devicePixelRatio*2);
        }else{
            this.canvas.width = W;
            this.canvas.height = H;
        }

        this.canvas.style.background = "url(img/indexbg.png) center bottom /cover";

        this.sc_scale = W/32;

        this.fps = 60;            //仅用于fps初始化
        this.lastFramTime = 0;    //仅用于fps更新

        this.bg = new Image();

        this.treeTop = [
            {x:375,y:323},        //主干
            {x:306,y:570},        //顺时针分叉一---左
            {x:251,y:473},        //顺时针分叉二---左
            {x:339,y:407},        //顺时针分叉三---左
            {x:395,y:358},        //顺时针分叉四---右
            {x:410,y:375},        //顺时针分叉五---右
            {x:457,y:401},        //顺时针分叉六---右
            {x:505,y:550},        //顺时针分叉七---右
            {x:340,y:574},        //分叉1-1---左
            {x:294,y:596},        //分叉1-2---左
            {x:348,y:486},        //分叉2-1---左
        ];
        this.treeSpot = [
            {moveToX:371,moveToY:741,cp1x:426,cp1y:574,cp2x:345,cp2y:435,endX:this.treeTop[0].x,endY:this.treeTop[0].y,cb1x:358,cb1y:453,cb2x:415,cb2y:511,end2X:403,end2Y:741},//主干
            {moveToX:391,moveToY:620,cp1x:357,cp1y:608,cp2x:335,cp2y:597,endX:this.treeTop[1].x,endY:this.treeTop[1].y,cb1x:322,cb1y:583,cb2x:337,cb2y:596,end2X:392,end2Y:614},//分叉1
            {moveToX:389,moveToY:573,cp1x:346,cp1y:553,cp2x:301,cp2y:523,endX:this.treeTop[2].x,endY:this.treeTop[2].y,cb1x:297,cb1y:516,cb2x:329,cb2y:536,end2X:390,end2Y:565},//分叉2
            {moveToX:379,moveToY:479,cp1x:371,cp1y:469,cp2x:354,cp2y:447,endX:this.treeTop[3].x,endY:this.treeTop[3].y,cb1x:352,cb1y:437,cb2x:368,cb2y:460,end2X:379,end2Y:471},//分叉3
            {moveToX:372,moveToY:402,cp1x:380,cp1y:393,cp2x:392,cp2y:370,endX:this.treeTop[4].x,endY:this.treeTop[4].y,cb1x:391,cb1y:377,cb2x:384,cb2y:388,end2X:373,end2Y:407},//分叉4
            {moveToX:387,moveToY:500,cp1x:409,cp1y:437,cp2x:405,cp2y:418,endX:this.treeTop[5].x,endY:this.treeTop[5].y,cb1x:407,cb1y:439,cb2x:403,cb2y:478,end2X:388,end2Y:506},//分叉5
            {moveToX:396,moveToY:553,cp1x:430,cp1y:494,cp2x:438,cp2y:457,endX:this.treeTop[6].x,endY:this.treeTop[6].y,cb1x:444,cb1y:467,cb2x:432,cb2y:507,end2X:397,end2Y:566},//分叉6
            {moveToX:399,moveToY:591,cp1x:445,cp1y:581,cp2x:453,cp2y:580,endX:this.treeTop[7].x,endY:this.treeTop[7].y,cb1x:463,cb1y:579,cb2x:452,cb2y:582,end2X:401,end2Y:597},//分叉7
            /*以下是小树枝*/
            {moveToX:362,moveToY:604,cp1x:351,cp1y:585,cp2x:349,cp2y:582,endX:this.treeTop[8].x,endY:this.treeTop[8].y,cb1x:351,cb1y:587,cb2x:348,cb2y:585,end2X:360,end2Y:604},//分叉7
            {moveToX:335,moveToY:596,cp1x:325,cp1y:596,cp2x:310,cp2y:596,endX:this.treeTop[9].x,endY:this.treeTop[9].y,cb1x:314,cb1y:599,cb2x:320,cb2y:597,end2X:340,end2Y:598},//分叉7
            {moveToX:365,moveToY:553,cp1x:355,cp1y:519,cp2x:358,cp2y:528,endX:this.treeTop[10].x,endY:this.treeTop[10].y,cb1x:351,cb1y:505,cb2x:352,cb2y:526,end2X:358,end2Y:553},//分叉7
        ];
    }
    Game.prototype = {
        getFps : function(now){
            var fps = 1 / (now - this.lastFramTime) * 1000;
            return fps;
        },
        draw : function(now){
            suchen.drawShu();
        },
        drawShu : function(){
                suchen.context.beginPath();
                suchen.context.strokeStyle = "transparent";
                suchen.context.lineWidth = 0.1;
            for(var i=0;i<this.treeSpot.length;i++){
                suchen.context.moveTo(this.treeSpot[i].moveToX,this.treeSpot[i].moveToY);
                suchen.context.bezierCurveTo(this.treeSpot[i].cp1x,
                                            this.treeSpot[i].cp1y,
                                            this.treeSpot[i].cp2x,
                                            this.treeSpot[i].cp2y,
                                            this.treeSpot[i].endX,
                                            this.treeSpot[i].endY
                                        );
                suchen.context.moveTo(this.treeSpot[i].endX,this.treeSpot[i].endY);
                suchen.context.bezierCurveTo(this.treeSpot[i].cb1x,
                                            this.treeSpot[i].cb1y,
                                            this.treeSpot[i].cb2x,
                                            this.treeSpot[i].cb2y,
                                            this.treeSpot[i].end2X,
                                            this.treeSpot[i].end2Y
                                            );
                suchen.context.lineTo(this.treeSpot[i].moveToX,this.treeSpot[i].moveToY);
                suchen.context.fillStyle = "#ad6330";
                suchen.context.fill();

            }
                suchen.context.stroke();
                suchen.context.closePath();

        },
        clearCanvas : function(now){
            suchen.context.clearRect(0,0,this.canvas.width,this.canvas.height);
        },
        animate : function(now){
            suchen.clearCanvas();
            suchen.getFps(now);
            suchen.draw(now);
            requestAnimationFrame(suchen.animate);
        },
        init : function(){
            this.bg.src = "img/me.png";
            this.bg.onload = function(){
                suchen.animate();
            }
        }
    }

    var suchen = new Game();
    suchen.init();

    window.ontouchmove = function(e){
        event.preventDefault();
    }
</script>

//以上基于移动端移动端移动端上锯齿效果,PC端有待自行测试~

时间: 2024-08-02 07:00:10

移动端canvas抗锯齿的相关文章

未来抗锯齿,FXAA/TXAA

前言:未来抗锯齿,FXAA/TXAA回顶部 [PConline 应用]在3D图像中,我们不可避免的遇到"锯齿".锯齿是由于受到显示设备分辨率和图像生成原理制约,不可避免的会出现的一种图像失真现象,具体表现为画面中物体的边缘呈现出直角的锯齿状.为了获得更好的视觉体验,让物体边缘看起来更柔和.自然,需要进行消除锯齿(Anti-Aliasing,简称AA)处理. 未来抗锯齿技术的方向:FXAA/TXAA 虽然抗锯齿了,但是模糊了 虽然FSAA全屏抗锯齿技术十分成熟,但是无论怎样发展,是不能够

bitmap缩放时抗锯齿

bitmap在进行放大缩小的时候经常会出现边缘锯齿的情况,通常的解决办法是在Paint中加入抗锯齿, paint.setAntiAlias(true); 但是有时候发现这并没有起到抗锯齿的作用,这是可以直接在Canvas中加入抗锯齿, canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG)); 结果证明这种方式可以解决锯齿问题.

Android画图之抗锯齿

在画图的时候,图片如果旋转或缩放之后,总是会出现那些华丽的锯齿.其实Android自带了解决方式.    方法一:给Paint加上抗锯齿标志.然后将Paint对象作为参数传给canvas的绘制方法. Java代码   paint.setAntiAlias(true); 方法二:给Canvas加上抗锯齿标志.有些地方不能用paint的,就直接给canvas加抗锯齿,更方便. Java代码   canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Pain

android 图片缩放抗锯齿

之前用的时候只设置了antialias属性,其实要设置两个flag才行 1 paint.setFlags(Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG); 2 //或者 3 canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG|Paint.FILTER_BITMAP_FLAG)); android 图片缩放抗锯齿

(转)Android中实现区域平均算法在图片缩放里的应用(缩放图片抗锯齿)

摘要:Android图片缩放效果较差,尤其是将大尺寸的图片缩放成小尺寸的图片时,即便是加了抗锯齿,锯齿现象也比较严重:而java sdk里的区域平均算法缩放图片,效果就比较完美了,因为jdk不能直接用于安卓项目中(类冲突),也没找到可以使用的替代的library,最终只好自己写,在此分享! 正文: 目前我知道的Android API中的传统的图片抗锯齿优化处理无非就是以下相关的设置: //缩放抗锯齿Bitmap.createScaledBitmap(bitmap, width, height,

android 抗锯齿方法[转]

在Android中,目前,我知道有两种出现锯齿的情况. ① 当我们用Canvas绘制位图的时候,如果对位图进行了选择,则位图会出现锯齿. ② 在用View的RotateAnimation做动画时候,如果View当中包含有大量的图形,也会出现锯齿.我们分别以这两种情况加以考虑. ◆ 用Canvas绘制位的的情况.在用Canvas绘制位图时,一般地,我们使用drawBitmap函数家族,在这些函数中,都有一个Paint参数,要 做到防止锯齿,我们就要使用到这个参数.如下:首先在你的构造函数中,需要创

SSE图像算法优化系列二十四: 基于形态学的图像后期抗锯齿算法--MLAA优化研究。

偶尔看到这样的一个算法,觉得还是蛮有意思的,花了将近10天多的时间研究了下相关代码. 以下为百度的结果:MLAA全称Morphological Antialiasing,意为形态抗锯齿是AMD推出的完全基于CPU处理的抗锯齿解决方案.对于游戏厂商使用的MSAA抗锯齿技术不同,Intel最新推出的MLAA将跨越边缘像素的前景和背景色进行混合,用第2种颜色来填充该像素,从而更有效地改进图像边缘的变现效果,这就是MLAA技术. 其实就是这个是由Intel的工程师先于2009年提出的技术,但是由AMD将

OpenGL核心技术之抗锯齿

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D实战核心技术详解>电子工业出版社等. CSDN视频网址:http://edu.csdn.net/lecturer/144 抗锯齿问题在游戏中一直存在的,尤其是体现在3D模型上的材质或者游戏UI界面上,由于现在引擎都非常完善,并且引擎都提供了抗锯齿功能,我们通过引擎提供的参数界面设置一下就可以消除.但是很

GPU抗锯齿

抗锯齿(Anti-aliasing):标准翻译为"抗图像折叠失真".由于在3D图像中,受分辨的制约,物体边缘总会或多或少的呈现三角形的锯齿,而抗锯齿就是指对图像边缘进行柔化处理,使图像边缘看起来更平滑,更接近实物的物体.它是提高画质以使之柔和的一种方法.如今最新的全屏抗锯齿(FullSceneAnti-Aliasing)可以有效的消除多边形结合处(特别是较小的多边形间组合中)的错位现象,降低了图像的失真度.全景抗锯齿在进行处理时,须对图像附近的像素进行2-4次采样,以达到不同级别的抗锯