javascript - js如何深拷贝ImageData?
大家讲道理
大家讲道理 2017-04-10 15:30:19
[JavaScript讨论组]

我在做js滤镜,因为要还原滤镜,需要拷贝一份原始的ImageData作备份。
使用过的方法有

oriData = $.extend(true,{},imageData);//拷贝完之后已经不是`ImageData`类型了

oriData = new ImageData(imageData.data,imageData.width,imageData.height);//参考https://developer.mozilla.org/zh-CN/docs/Web/API/ImageData/ImageData这里的用法,但是发现这其实是一种浅拷贝...也不行
大家讲道理
大家讲道理

光阴似箭催人老,日月如移越少年。

全部回复(3)
黄舟

你要深拷贝的话这样不行么。。

var temp= new ImageData(imagedata.width, imagedata.height);
temp.data.set(imagedata.data);

其实在我一个项目里我是更想找一个优雅的浅拷贝的方法来提高效率的。。

阿神

额。。。我在控制台上试了一下,发现new ImageData 是可以新建一个ImageData对象,但是ImageData.data 对象却依然是浅拷贝,所以只要也 new一个这个就行了。而new Uint8ClampedArray这个构造函数的用法也纯粹是乱试出来的...因为没找到介绍这个对象的文档,也不知道这样的兼容性怎么样,求大大帮忙~~

var copyImageData = function(imgData){
    return imgData && new ImageData(new Uint8ClampedArray(imgData.data),imgData.width,imgData.height);
};

var bb = copyImageData(temp1) //temp1是我通过console.log出来的一个ImageData,在控制台保存为temp1
//=>ImageData {data: Uint8ClampedArray[1218816]}

temp1.data[0]
//=>222

bb.data[0]
//=>222

temp1.data[0] = 189
//=>189

bb.data[0]
//=>222

ps.题外话,在任何方法中,使用这种需要深拷贝的数据时,必须先深拷贝再修改数据,否则作为参数传入的数据也能被修改

PHPz

不懂,先关注

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号