美文网首页js css htmlweb
CocosCreator中,发布web,打开本地图片

CocosCreator中,发布web,打开本地图片

作者: 全新的饭 | 来源:发表于2022-10-28 16:59 被阅读0次

参考

Cocos Creator 国旗头像生成器,源码奉上!
creator 发布web时,打开本地图片
说明:参考链接中的方法在CocosCreator3.x中无法直接使用,需做如下修改。

实现

在index文件中body内添加如下标签

<p hidden="hidden"><input id="OpenImageFile" type="file" name="image" accept="image/*"></p>

2处。

  1. 工程预览
    文件:index.ejs
    目录:Cocos\CocosDashboard\resources\Editor\Creator\3.6.0\resources\app.asar.unpacked\builtin\preview\static\views

  2. 本工程目录下的build-templates\web-mobile下的index.html

通过OpenImgFile.openFile将打开的图片转为SpriteFrame

OpenImgFile.ts

import { input, SpriteFrame } from "cc";

export default class OpenImgFile
{ 
    private static readonly tagName = 'OpenImageFile';
    private static canRepeatUpload()
    {
        const inputImgFile = document.getElementById(OpenImgFile.tagName);
        if (!inputImgFile)
        { 
            console.info('上传失败!!!');
            return;
        }

        if (inputImgFile.outerHTML)
        {
            inputImgFile.outerHTML = inputImgFile.outerHTML;
        }

        if (inputImgFile.nodeValue)
        { 
            inputImgFile.nodeValue = null;
        }
    }

    public static openFile(setSpriteFrame: (spriteFrame: SpriteFrame) => void)
    { 
        const inputImgFile = document.getElementById(OpenImgFile.tagName);
        if (inputImgFile)
        {
            console.info('openFile成功!!!!');

            inputImgFile.onchange = (e) =>
            { 

                const files = (<HTMLInputElement>e.target).files;
                const upType = files[0].type;
                if (upType == 'image/gif' || upType.indexOf('image') < 0)
                { 
                    console.info('只能上传图片!!!');
                    OpenImgFile.canRepeatUpload();
                    return;
                }
                try
                {
                    if (window.FileReader)
                    { 
                        const curFile = files[0];
                        const fileReader = new FileReader();
                        fileReader.readAsDataURL(curFile);
                        if (curFile.size > 1024 * 1024 * 5)
                        { 
                            console.info('文件太大,请重选!!!');
                            OpenImgFile.canRepeatUpload();
                            return;
                        }
                        fileReader.onload = (ee) =>
                        { 
                            if (fileReader.readyState == fileReader.DONE)
                            {
                                OpenImgFile.canRepeatUpload();
                                const strImg = <string>ee.target.result;
                                if (setSpriteFrame)
                                { 
                                    const img = new Image();
                                    img.src = strImg;

                                    img.onload = () => {
                                        const spriteFrame = SpriteFrame.createWithImage(img);
                                        setSpriteFrame(spriteFrame);
                                    }
                                }
                            }
                        }

                    }
                    else
                    { 
                        console.info('不支持该浏览器!!!');
                    }
                }
                catch (err)
                { 
                    console.info('读取文件失败,再试一次!');
                    OpenImgFile.canRepeatUpload();
                    return;
                }
            }
        }
        else
        { 
            console.info('openFile失败!!!!');
        }

        if (inputImgFile)
        {
            inputImgFile.click();
        }
    }
}

测试:
点击按钮触发下面代码中的openFile方法,选择好图片后,图片会被显示在Sprite上。
Test.ts

import { _decorator, Component, Node, randomRangeInt, spriteAssembler, Sprite, SpriteFrame, Texture2D, ImageAsset } from 'cc';
import OpenImgFile from '../Scripts/TestImg/OpenImgFile';
const { ccclass, property } = _decorator;

@ccclass('Test')
export class Test extends Component
{
    @property({ type: Sprite, visible: true })
    private _sprite: Sprite;

    private setSpriteFrame(spriteFrame: SpriteFrame):void
    { 
        this._sprite.spriteFrame = spriteFrame;
    }
    // 点击按钮触发
    private openFile(): void
    {
        OpenImgFile.openFile((spriteFrame: SpriteFrame) => this.setSpriteFrame(spriteFrame));
    }
}

相关文章

网友评论

    本文标题:CocosCreator中,发布web,打开本地图片

    本文链接:https://www.haomeiwen.com/subject/eqdftdtx.html