JavaScript移动端H5生成高清图片方案:解决Canvas模糊问题

作者:小圆点

时间:2026-10-25

浏览:263

本文详解在移动端H5页面中生成分享图片的技术方案。针对高清屏幕导致的Canvas模糊问题,通过获取window.devicePixelRatio调整Canvas物理尺寸与CSS样式比例,并调用html2canvas库实现高清渲染。最后结合微信环境特性,提供生成图片文件以支持长按保存至相册的完整实现逻辑。

文章目录

当前许多微信公众号运营活动需要生成图片功能,以便用户将图片分享给好友或发布到朋友圈,从而促进产品的传播与宣传。

1.

虽然可以使用原生Canvas API生成图片,但为了节省开发时间,直接采用了开源库html2canvas来实现该功能。

相关项目地址:html2canvas

在线演示地址:LiveDemo


    /**
     * 根据window.devicePixelRatio获取像素比
     */
    function DPR() {
        if (window.devicePixelRatio && window.devicePixelRatio > 1) {
            return window.devicePixelRatio;
        }
        return 1;
    }
    /**
     *  将传入值转为整数
     */
    function parseValue(value) {
        return parseInt(value, 10);
    };
    /**
     * 绘制canvas
     */
    async function drawCanvas (selector) {
        // 获取想要转换的 DOM 节点
        const dom = document.querySelector(selector);
        const box = window.getComputedStyle(dom);
        // DOM 节点计算后宽高
        const width = parseValue(box.width);
        const height = parseValue(box.height);
        // 获取像素比
        const scaleBy = DPR();
        // 创建自定义 canvas 元素
        var canvas = document.createElement('canvas');
        // 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比
        canvas.width = width * scaleBy;
        canvas.height = height * scaleBy;
        // 设定 canvas css宽高为 DOM 节点宽高
        canvas.style.width = `${width}px`;
        canvas.style.height = `${height}px`;
 
        // 获取画笔
        const context = canvas.getContext('2d');
 
        // 将所有绘制内容放大像素比倍
        context.scale(scaleBy, scaleBy);
 
        let x = width;
        let y = height;
        return await html2canvas(dom, {canvas}).then(function () {
            convertCanvasToImage(canvas, x ,y)
        })
    }
 
    /**
     * 图片转base64格式
     */
    function convertCanvasToImage(canvas, x, y) {
        let image = new Image();
        let _container = document.getElementsByClassName('container')[0];
        let _body = document.getElementsByTagName('body')[0];
        image.width = x;
        image.height = y;
        image.src = canvas.toDataURL("image/png");
        _body.removeChild(_container);
        document.body.appendChild(image);
        return image;
    }
    drawCanvas('.container')

2.

现代智能手机多为高清屏幕,若不对Canvas进行特殊处理,生成的图片会出现模糊现象。这主要与设备像素比(devicePixelRatio)有关,JavaScript提供了window.devicePixelRatio属性用于获取该比值。


function DPR() {
        if (window.devicePixelRatio && window.devicePixelRatio > 1) {
            return window.devicePixelRatio;
        }
        return 1;
    }

上述DPR函数用于获取设备的像素比。获取该比值后,需进行相应的尺寸调整处理。


var canvas = document.createElement('canvas');
        // 设定 canvas 元素属性宽高为 DOM 节点宽高 * 像素比
        canvas.width = width * scaleBy;
        canvas.height = height * scaleBy;
        // 设定 canvas css宽高为 DOM 节点宽高
        canvas.style.width = `${width}px`;
        canvas.style.height = `${height}px`;
 
        // 获取画笔
        const context = canvas.getContext('2d');
 
        // 将所有绘制内容放大像素比倍
        context.scale(scaleBy, scaleBy);

3.

在获取设备像素比后,需将Canvas的width和height属性乘以该比值(即scaleBy)。随后,将canvas.style.width和canvas.style.height设置为原始DOM元素的宽高。这样做的目的是在绘制时将内容放大像素比倍,以匹配高清屏幕的物理像素。

以iPhone 6S为例,其逻辑宽高为375 x 667,而window.devicePixelRatio为2(物理像素750除以逻辑像素375)。因此,设计师通常提供的设计稿尺寸为750 x 1334。

若在高清屏下按1:1比例绘制,图片将会模糊。例如iPhone 6S的DPR为2。

iPhone 6 Plus的DPR为3。

4.

最后调用canvas.toDataURL("image/png")获取图片数据,并赋值给image.src。由于微信环境内无法直接保存Canvas生成的图片,因此需生成图片文件,利用微信自带的长按保存图片到相册的功能完成保存。

至此,关于JavaScript移动端H5生成图片的解决方案介绍完毕。如需了解更多相关内容,可搜索本站往期文章或继续浏览后续文章,感谢大家的支持!

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章