Createjs开发:如何为影片剪辑内的Bitmap位图实现像素化效果
CreateJS 容器内Bitmap位图像素化实现方案
你无需改动现有影片剪辑容器管理、位图加载、居中定位的业务逻辑,直接通过离屏Canvas预处理图像源即可实现像素化效果,完全兼容CreateJS原生Bitmap对象的所有属性和方法。
核心实现逻辑
和你之前调研的原生Canvas像素化原理一致,只是把挂载在DOM上的Canvas换成内存中运行的离屏Canvas,不侵入现有页面画布的绘制逻辑,处理完成后将离屏Canvas作为Bitmap的输入源即可:
- 内存中创建不挂载到DOM的离屏Canvas,按设定的像素块粒度缩小Canvas尺寸
- 关闭所有环境下的图像抗锯齿开关,保证缩放时为硬边像素效果
- 将原图缩小绘制到离屏Canvas后,直接把该Canvas传入
createjs.Bitmap()作为图像源 - 调整缩放参数匹配原有显示尺寸,后续原有逻辑无需任何修改
适配你现有代码的完整实现
init_image = () => { props.image = null _.holder_grid.bitmap = null props.image = new Image() props.image.src = "images/myImage.jpg" props.image.onload = function() { // 像素化配置:值越小像素块越大,建议取值范围0.02~1 const pixelSize = props.pixelate || 0.1; // 创建内存离屏canvas,不需要插入页面DOM const offCanvas = document.createElement('canvas'); const offCtx = offCanvas.getContext('2d'); // 按像素比例设置缩小后的画布尺寸 const originW = props.image.width; const originH = props.image.height; offCanvas.width = originW * pixelSize; offCanvas.height = originH * pixelSize; // 关闭离屏画布的图像平滑 offCtx.msImageSmoothingEnabled = false; offCtx.mozImageSmoothingEnabled = false; offCtx.webkitImageSmoothingEnabled = false; offCtx.imageSmoothingEnabled = false; // 将原图缩小绘制到离屏画布 offCtx.drawImage(props.image, 0, 0, offCanvas.width, offCanvas.height); // 关闭CreateJS舞台画布的图像平滑,保证放大后为硬边像素块 stage.canvas.msImageSmoothingEnabled = false; stage.canvas.mozImageSmoothingEnabled = false; stage.canvas.webkitImageSmoothingEnabled = false; stage.canvas.imageSmoothingEnabled = false; // 将处理好的离屏canvas作为Bitmap源传入,替代原图片对象 stage.holder_grid.bitmap = new createjs.Bitmap(offCanvas); // 缩放值同步除以像素比例,保证最终显示尺寸和原逻辑完全一致 stage.holder_grid.bitmap.scale = props.image_scale / pixelSize; stage.holder_grid.addChild(_.holder_grid.bitmap); const coords = redraw.get_centre(); stage.holder_grid.bitmap.x = coords.x; stage.holder_grid.bitmap.y = coords.y; settings.update(); } } init_image();
注意事项
- 该方案不需要额外引入第三方库,兼容所有CreateJS版本,生成的Bitmap对象仍然在
holder_grid影片剪辑容器内,原有交互、层级调整、属性修改逻辑全部生效 - 静态图片场景下,像素化处理仅在图片加载时执行一次,无持续运行的性能损耗
- 如果需要动态调整像素化程度,只需把离屏Canvas处理逻辑抽为独立函数,参数变化时重新生成离屏Canvas,赋值给
stage.holder_grid.bitmap.image后调用stage.update()即可实时生效 - 不要尝试用CreateJS内置的模糊、颜色类滤镜拼接像素效果,这类滤镜逐帧运行的性能比离屏预处理低30%以上,边缘像素效果也不统一
内容的提问来源于stack exchange,提问作者EdelweissPirate
相关产品推荐
相关产品推荐

