module es { /** * 纹理帮助类 */ export class TextureUtils { public static sharedCanvas: HTMLCanvasElement; public static sharedContext: CanvasRenderingContext2D; public static convertImageToCanvas(texture: egret.Texture, rect?: egret.Rectangle): HTMLCanvasElement { if (!this.sharedCanvas) { this.sharedCanvas = egret.sys.createCanvas(); this.sharedContext = this.sharedCanvas.getContext("2d"); } let w = texture.$getTextureWidth(); let h = texture.$getTextureHeight(); if (!rect) { rect = egret.$TempRectangle; rect.x = 0; rect.y = 0; rect.width = w; rect.height = h; } rect.x = Math.min(rect.x, w - 1); rect.y = Math.min(rect.y, h - 1); rect.width = Math.min(rect.width, w - rect.x); rect.height = Math.min(rect.height, h - rect.y); let iWidth = Math.floor(rect.width); let iHeight = Math.floor(rect.height); let surface = this.sharedCanvas; surface["style"]["width"] = iWidth + "px"; surface["style"]["height"] = iHeight + "px"; this.sharedCanvas.width = iWidth; this.sharedCanvas.height = iHeight; if (egret.Capabilities.renderMode == "webgl") { let renderTexture: egret.RenderTexture; //webgl下非RenderTexture纹理先画到RenderTexture if (!(texture).$renderBuffer) { if (egret.sys.systemRenderer["renderClear"]) { egret.sys.systemRenderer["renderClear"](); } renderTexture = new egret.RenderTexture(); renderTexture.drawToTexture(new egret.Bitmap(texture)); } else { renderTexture = texture; } //从RenderTexture中读取像素数据,填入canvas let pixels = renderTexture.$renderBuffer.getPixels(rect.x, rect.y, iWidth, iHeight); let x = 0; let y = 0; for (let i = 0; i < pixels.length; i += 4) { this.sharedContext.fillStyle = 'rgba(' + pixels[i] + ',' + pixels[i + 1] + ',' + pixels[i + 2] + ',' + (pixels[i + 3] / 255) + ')'; this.sharedContext.fillRect(x, y, 1, 1); x++; if (x == iWidth) { x = 0; y++; } } if (!(texture).$renderBuffer) { renderTexture.dispose(); } return surface; } else { let bitmapData = texture; let offsetX: number = Math.round(bitmapData.$offsetX); let offsetY: number = Math.round(bitmapData.$offsetY); let bitmapWidth: number = bitmapData.$bitmapWidth; let bitmapHeight: number = bitmapData.$bitmapHeight; let $TextureScaleFactor = Core._instance.stage.textureScaleFactor; this.sharedContext.drawImage(bitmapData.$bitmapData.source, bitmapData.$bitmapX + rect.x / $TextureScaleFactor, bitmapData.$bitmapY + rect.y / $TextureScaleFactor, bitmapWidth * rect.width / w, bitmapHeight * rect.height / h, offsetX, offsetY, rect.width, rect.height); return surface; } } public static toDataURL(type: string, texture: egret.Texture, rect?: egret.Rectangle, encoderOptions?): string { try { let surface = this.convertImageToCanvas(texture, rect); let result = surface.toDataURL(type, encoderOptions); return result; } catch (e) { egret.$error(1033); } return null; } /** * 有些杀毒软件认为 saveToFile 可能是一个病毒文件 * @param type * @param texture * @param filePath * @param rect * @param encoderOptions */ public static eliFoTevas(type: string, texture: egret.Texture, filePath: string, rect?: egret.Rectangle, encoderOptions?): void { let surface = this.convertImageToCanvas(texture, rect); let result = (surface as any).toTempFilePathSync({ fileType: type.indexOf("png") >= 0 ? "png" : "jpg" }); wx.getFileSystemManager().saveFile({ tempFilePath: result, filePath: `${wx.env.USER_DATA_PATH}/${filePath}`, success: function (res) { //todo } }); return result; } public static getPixel32(texture: egret.Texture, x: number, y: number): number[] { egret.$warn(1041, "getPixel32", "getPixels"); return texture.getPixels(x, y); } public static getPixels(texture: egret.Texture, x: number, y: number, width: number = 1, height: number = 1): number[] { //webgl环境下不需要转换成canvas获取像素信息 if (egret.Capabilities.renderMode == "webgl") { let renderTexture: egret.RenderTexture; //webgl下非RenderTexture纹理先画到RenderTexture if (!(texture).$renderBuffer) { renderTexture = new egret.RenderTexture(); renderTexture.drawToTexture(new egret.Bitmap(texture)); } else { renderTexture = texture; } //从RenderTexture中读取像素数据 let pixels = renderTexture.$renderBuffer.getPixels(x, y, width, height); return pixels; } try { let surface = this.convertImageToCanvas(texture); let result = this.sharedContext.getImageData(x, y, width, height).data; return result; } catch (e) { egret.$error(1039); } } } }