// 创建临时相机
const cameraNode = new Node('TempCropCamera');
cameraNode.parent = this.node;
cameraNode.setPosition(0, 0, 1000);
const camera = cameraNode.addComponent(Camera);
camera.projection = Camera.ProjectionType.ORTHO;
camera.orthoHeight = this.cropHeight / 2;
camera.near = 1;
camera.far = 2000;
camera.clearFlags = Camera.ClearFlag.SOLID_COLOR;
camera.clearColor = new Color(0, 0, 0, 0);
camera.visibility = 1 << 20;
// 创建 RenderTexture
const renderTex = new RenderTexture();
renderTex.reset({ width: outW, height: outH });
camera.targetTexture = renderTex;
// 临时改图片节点 layer
const originalLayer = this._imageNode.layer;
this._imageNode.layer = 1 << 20;
// 等一帧渲染完成
this.scheduleOnce(async () => {
// 读取像素
const buffer = new Uint8Array(outW * outH * 4);
renderTex.readPixels(0, 0, outW, outH, buffer);
// 恢复所有状态
this._imageNode.layer = originalLayer;
if (mask) mask.enabled = maskWasEnabled;
cameraNode.destroy();
renderTex.destroy();
// 翻转 Y 轴
this._flipPixelsY(buffer, outW, outH);
// 创建 SpriteFrame(用于显示)
const spriteFrame = this._createSpriteFrame(buffer, outW, outH);
// 编码为 JPEG Base64(用于上传)
try {
const base64 = await ImageHelper.encodeToJPEG(
buffer,
outW,
outH,
this.quality
);
resolve({
success: true,
spriteFrame: spriteFrame,
base64: base64,
width: outW,
height: outH
});
} catch (err) {
resolve({
success: false,
error: `图像编码失败: ${err.message}`
});
}
}, 0);
} catch (e) {
resolve({ success: false, error: e.message });
},这段代码在web环境下可以保存texture内容,但在安卓原生环境下无法读取,返回数据全部为0,无论如何等待渲染都不行