A Cocos Creator web build can use an HTML file input and JavaScript APIs to select images on desktop or mobile.
Create a hidden picker and read the selected file:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| private inputElement: HTMLInputElement;
private createInput() { this.inputElement = document.createElement('input'); this.inputElement.type = 'file'; this.inputElement.accept = 'image/*'; this.inputElement.style.display = 'none'; document.body.appendChild(this.inputElement); this.inputElement.addEventListener('change', event => { const target = event.target as HTMLInputElement; if (target.files?.length) this.handleFileUpload(target.files[0]); }); }
private clickButton() { this.inputElement.click(); }
|
Reject oversized files, convert the image to a data URL, then crop and compress it:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| private handleFileUpload(file: File) { if (file.size > 1024 * 1024) { console.error('The file is too large'); return; } const reader = new FileReader(); reader.onload = event => { const url = event.target?.result as string; this.compressImage(url, 126, 126).then(result => { this.loadTextureInCocos(this.imgNode, result, 126, 126); }); }; reader.readAsDataURL(file); }
public compressImage(url: string, targetWidth: number, targetHeight: number): Promise<string> { return new Promise(resolve => { const img = new Image(); img.src = url; img.onload = () => { const size = Math.min(img.width, img.height); const startX = (img.width - size) / 2; const startY = (img.height - size) / 2; const canvas = document.createElement('canvas'); canvas.width = targetWidth; canvas.height = targetHeight; canvas.getContext('2d')?.drawImage( img, startX, startY, size, size, 0, 0, targetWidth, targetHeight ); resolve(canvas.toDataURL('image/jpeg', 0.5)); }; }); }
|
Create a Cocos texture and SpriteFrame:
1 2 3 4 5 6 7 8 9 10 11 12
| public loadTextureInCocos(node: Node, imageUrl: string, width: number, height: number) { const image = new Image(); image.onload = () => { const texture = new Texture2D(); texture.image = new ImageAsset(image); const frame = new SpriteFrame(); frame.texture = texture; node.getComponent(Sprite).spriteFrame = frame; node.getComponent(UITransform).setContentSize(width, height); }; image.src = imageUrl; }
|
Use HTTPS, remove the hidden DOM element when the component is destroyed, and keep memory usage in mind for large images.