当前位置:   article > 正文

CocosCreator图片处理:截图裁剪,保存到本地,从本地加载,远端图片转base64_cocos create 拷贝node图片

cocos create 拷贝node图片
  • 截图裁剪

从相机导出的renderTexture中使用readPixels读取像素数据,通过像素数据创建spriteFrame可以展示到界面上。

  1. this.rt = new RenderTexture();
  2. this.rt.initialize({
  3. width: view.getVisibleSize().width,
  4. height: view.getVisibleSize().height,
  5. })
  6. this.camera.getComponent(Camera).targetTexture = this.rt;
  7. this.scheduleOnce(()=>{
  8. console.log("下一帧开始-->")
  9. this.camera.active = false
  10. this._buffer = this.rt.readPixels(Math.round(worldPos.x - width / 2), Math.round(worldPos.y - height / 2), width, height);
  11. console.log(this._buffer)
  12. })
  13. let img = new ImageAsset();
  14. img.reset({
  15. _data: this._buffer,
  16. width: width,
  17. height: height,
  18. format: Texture2D.PixelFormat.RGBA8888,
  19. _compressed: false
  20. });
  21. let texture = new Texture2D();
  22. texture.image = img;
  23. let sf = new SpriteFrame();
  24. sf.texture = texture;
  25. sf.packable = false;
  26. this.showSprite!.getComponent(Sprite).spriteFrame = sf;
  27. this.showSprite!.getComponent(Sprite).spriteFrame.flipUVY = true;
  28. if (sys.isNative && (sys.os === sys.OS.IOS || sys.os === sys.OS.OSX)) {
  29. this.showSprite!.getComponent(Sprite).spriteFrame.flipUVY = false;
  30. }
  31. this.showSprite?.getComponent(UITransform)?.setContentSize(new Size(width, height));

  • 保存到本地

在3.6.0版本及以前是不支持这个方法的,在下面的链接中官方提供了一个方法:

【CocosCreator 3.x 技术方案分享】第一期 - Creator 3.x - Cocos中文社区

目前 3.0.0 ~ 3.6.0 版本还不支持 jsb.saveImageData , 引擎将在 3.6.1 支持。

提供一个在 3.6.1 版本之前可以使用 jsb.saveImageData 的方案 https://gitee.com/zzf2019/engine-native/commit/4af67e64a1caeb951016a9920efb7ee46d479ae5 38 ,目前此方案仅支持在 android 和 ios 上将 imageData 保存为本地 png 文件。


  • 从本地加载

引擎提供了loadRemote方法可以加载本地资源。

  1. let filePath = jsb.fileUtils.getWritablePath() + 'render_to_sprite_image.png';
  2. assetManager.loadRemote<ImageAsset>(filePath, (err, imageAsset)=> {
  3. if (err) {
  4. console.log("show image error")
  5. } else {
  6. console.log(`开始加载本地图片成功: ${filePath}`);
  7. const spriteFrame = new SpriteFrame();
  8. const texture = new Texture2D();
  9. texture.image = imageAsset;
  10. spriteFrame.texture = texture;
  11. this.copyNode.getComponent(Sprite).spriteFrame = spriteFrame;
  12. spriteFrame.packable = false;
  13. spriteFrame.flipUVY = true;
  14. if (sys.isNative && (sys.os === sys.OS.IOS || sys.os === sys.OS.OSX)) {
  15. spriteFrame.flipUVY = false;
  16. }
  17. }
  18. });

本地图片转base64自不必说,直接读数据就行了。

jsb.fileUtils.getDataFromFile()

远端图片可以使用loadAny方法,获取图片的二进制数据,然后转为base64数据:

  1. static buffer2Base64(arrayBuffer) {
  2. let base64 = '';
  3. const encodings = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
  4. const bytes = new Uint8Array(arrayBuffer);
  5. const byteLen = bytes.byteLength;
  6. const byteRem = byteLen % 3;
  7. const mainLength = byteLen - byteRem;
  8. let byte1, byte2, byte3, byte4, tmp;
  9. for (let i = 0; i < mainLength; i += 3) {
  10. tmp = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
  11. byte1 = (tmp & 16515072) >> 18;
  12. byte2 = (tmp & 258048) >> 12;
  13. byte3 = (tmp & 4032) >> 6;
  14. byte4 = tmp & 63;
  15. base64 += encodings[byte1] + encodings[byte2] + encodings[byte3] + encodings[byte4];
  16. }
  17. if (byteRem === 1) {
  18. tmp = bytes[mainLength];
  19. byte1 = (tmp & 252) >> 2;
  20. byte2 = (tmp & 3) << 4;
  21. base64 += `${encodings[byte1]}${encodings[byte2]}==`;
  22. } else if (byteRem === 2) {
  23. tmp = (bytes[mainLength] << 8) | bytes[mainLength + 1];
  24. byte1 = (tmp & 64512) >> 10;
  25. byte2 = (tmp & 1008) >> 4;
  26. byte3 = (tmp & 15) << 2;
  27. base64 += `${encodings[byte1]}${encodings[byte2]}${encodings[byte3]}=`;
  28. }
  29. console.log(base64)
  30. return base64
  31. }
  32. let filePath = "https:/test.png"
  33. assetManager.loadAny({url: filePath, ext: '.bin' }, (err, assets) => {
  34. console.log(`data:image/png;base64,${this.buffer2Base64(assets)}`)
  35. });

 如果觉得有帮助请给我点赞并收藏哦~您的支持是我最大的鼓励~

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/152427
推荐阅读
相关标签
  

闽ICP备14008679号