梅宝
梅宝
  • 发布:2023-04-16 19:33
  • 更新:2023-04-17 17:03
  • 阅读:376

canvasPutImageData画不出内容

分类:uni-app

代码:

<template>  
    <view class="">  
               <view class="padding-top-lg">  
            <view class="flex justify-center">  
                <button @tap="toBit" class="cu-btn bg-cyan round" style="width: 500upx;">转化</button>  
            </view>  
        </view>  
               <view class="padding-top-lg">  
            <view class="justify-center flex">  
                <canvas id="bitmap" style="width: 400px;height: 300px;" canvas-id="bitmap"></canvas>  
            </view>  
        </view>  
               <view class="padding-top-lg">  
            <view class="justify-center flex">  
                <canvas id="bitmap2" style="width: 400px;height: 300px;" canvas-id="bitmap2"></canvas>  
            </view>  
        </view>  
    </view>  
</template>  
<script>  
    let t  
    export default {  
        data() {  
            return {  

            }  
        },  
        onLoad() {  
            t = this  

        },  
        onReady() {  

        },  
        methods: {  
            async toBit() {  
                                let context = uni.createCanvasContext('bitmap', t)  
                let dataSrc, dataTrg, luma, len, c  
                                c = new Image()  
                c.src = '../../static/debug.jpg'  
                c.onload = () => {  
                    context.drawImage('../../static/debug.jpg', 0, 0, c.width, c.height)  
                    context.draw()  
                    setTimeout(() => {  
                        uni.canvasGetImageData({  
                            canvasId: 'bitmap',  
                            x: 0,  
                            y: 0,  
                            width: c.width,  
                            height: c.height,  
                            success(res) {  
                                dataTrg = res.data  
                                                                console.log(dataTrg);  
                                uni.canvasPutImageData({  
                                    canvasId: 'bitmap2',  
                                    x: 0,  
                                    y: 0,  
                                    width: c.width,  
                                    data: dataTrg  
                                })  
                            }, 1000)  
                 }  
}  
}  
以下省略  
.......

说明:按钮绑定事件触发时,画布bitmap载入图片debug.jpg,然后1秒后延迟取画布id为bitmap的像素数据,然后把像素数据赋值ID为bitmap2的画布,实际结果是bitmap2画布并没有绘制任何内容,且控制台报错{errMsg: 'canvasPutImageData:fail'},打印dataTrg 有像素数组信息,见截图:

请教如何处理??
这个图片是400x300像素大小,用72x72像素的图片就正常,是canvasPutImageData有图片大小限制还是我哪里做的有问题,请教一下。
感谢

2023-04-16 19:33 负责人:无 分享
已邀请:
DCloud_UNI_WZF

DCloud_UNI_WZF

上述代码 默认模板项目 logo.png 测试正常,请检查代码逻辑及资源,如确认框架问题,提供测试工程

  • 梅宝 (作者)

    logo.png是正常的,我上面也说了72x72像素图片正常,上面说的72x72就是用Logo.png测试正常,换400x300图片就报错,除了替换图片外没有任何改动

    2023-04-17 16:31

  • 梅宝 (作者)

    同样代码编译在小程序正常,在H5就会出现上述问题,注意图片大小是400x300,换默认工程的72x72图片则都正常

    2023-04-17 16:33

  • 梅宝 (作者)

    找到问题了,原始图片是400x300大小,画布1载入这个图绘制后再用canvasGetImageData获取像素信息,在回调中width变成了390,实际应该是400,这时候把400传递到canvasPutImageData去绘制另外一个画布就会报错,所以还是有问题,问题在于画布载入图像后获取像素信息后尺寸变化了

    2023-04-17 16:38

DCloud_UNI_WZF

DCloud_UNI_WZF

确认下是否图片资源问题,随机找了一张网图测试正常

  • 梅宝 (作者)

    你好,看下你那边宽度有没有变化,我用这个图绘制到画布里再取像素信息,宽度变成了390,这也是我昨天提出问题绘制错误的主要原因,正常一张400x300像素的图片绘制到400x300的画布中,宽度不应该不变么,有点不理解是不是我本地哪里有问题

    2023-04-17 17:02

梅宝

梅宝 (作者)

  • DCloud_UNI_WZF

    测试正常,mac m1 pro HBuilderX 3.7.13 chrome 112.0.5615.49

    你换台设备或浏览器试下呢

    2023-04-17 17:11

  • 梅宝 (作者)

    回复 DCloud_UNI_WZF: 害!找到问题了,是设备最大宽度问题,390是Chrome选用设备尺寸最大宽度,所以其实没有问题,抱歉

    2023-04-17 17:35

要回复问题请先登录注册