HarmonyOS 鸿蒙Next:调用PixelMap进行图片保存到本地出现系统闪退

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS 鸿蒙Next:调用PixelMap进行图片保存到本地出现系统闪退 【关键字】
PixelMap / 图片 / 保存 / 闪退

【问题描述】
获取相册图片进行裁剪,完成之后,对图片调用PixelMap进行保存到本地,出现系统闪退。

关键代码如下:

export async function savePixelMapV2(context: Context, pixelMap: PixelMap): Promise<string> {  
if (pixelMap === null) {  
console.error('传入的pm为空')  
return '';  
}  
const imagePackerApi: image.ImagePacker = image.createImagePacker();  
const path: string = context.cacheDir + '/' + getTimeStr() + '.jpg';  
const packOpts: image.PackingOption = { format: 'image/jpeg', quality: 100 };  
let file = fs.openSync(path, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);  
return await imagePackerApi.packToFile(pixelMap, file.fd, packOpts).then(() => {  
//直接打包进文件  
fs.closeSync(file.fd);  
return " "  
}).catch((error: Error) => {  
console.error('Failed to pack the image. And the error is: ' + error);  
return " "  
})  
}  

.then(() => {  
if (this.pixelMap) {  
console.debug("savePixelMapV2...")  
savePixelMapV2(getContext(this), this.pixelMap)  
}  
this.flushPixelMapNew();  
});  

单独的click回调正常执行不会有任何问题。但是在then里面调用savePixelMapV2方法必现崩溃。

【解决方案】

export async function savePixelMapV2(context: Context, pixelMap: PixelMap,width: number, height: number):Promise<string> {  
if (pixelMap === null) {  
console.error('传入的pm为空')  
return '';  
}  
const imagePackerApi: image.ImagePacker = image.createImagePacker();  
const path: string = context.cacheDir + '/' + getTimeStr() + '.jpg';  
const packOpts: image.PackingOption = { format: 'image/jpeg', quality: 100 };  
let file = fs.openSync(path, fs.OpenMode.CREATE | fs.OpenMode.READ_WRITE);  
console.log('path:'+path+"--file:"+file.fd)  

//该三个参数测试固定为16:9,建议封装调用  
const cropWidth = width;  
const cropHeight = Math.floor(width * (CommonConstants.CROP_RATE_9_16));  
const cropPosition = new RegionItem(0, Math.floor((height - cropHeight) / CommonConstants.AVERAGE_WEIGHT_WIDTH));  

//裁切后打包  
return pixelMap.crop({  
size: {  
width: cropWidth,  
height: cropHeight  
},  
x: cropPosition.x,  
y: cropPosition.y  
}).then(() => {  
console.info('Sucessed in cropping pixelmap.');  
imagePackerApi.packToFile(pixelMap, file.fd, packOpts)  
.then(() => {  
console.info('Succeeded in packToFile.');  
//直接打包进文件  
fs.closeSync(file.fd);  
console.debug("path_:" + path)  
return ''  
}).catch((error : BusinessError) => {  
console.error('Failed to packToFile.');  
return ''  
})  
return '';  
}).catch((err : BusinessError) => {  
console.error('Failed to crop pixelmap.');  
return '';  
});  
}  

16:9 方法调用修改部分如下:

case CropType.RECTANGLE:  
if (this.pixelMap) {  
// rectangle(this.pixelMap, imageWidth, imageHeight)  
// .then(() => {  
// if (this.pixelMap) {  
// console.debug("savePixelMapV2...")  
// savePixelMapV2(getContext(this), this.pixelMap)  
// }  
// this.flushPixelMapNew();  
// });  
savePixelMapV2(getContext(this),this.pixelMap,imageWidth,imageHeight).then(() => {  
this.flushPixelMapNew();  
})  

break;  

更多关于HarmonyOS 鸿蒙Next:调用PixelMap进行图片保存到本地出现系统闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next:调用PixelMap进行图片保存到本地出现系统闪退的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


针对HarmonyOS鸿蒙Next系统中调用PixelMap进行图片保存到本地时出现系统闪退的问题,可能的原因及解决方案如下:

  1. 权限问题

    • 确保应用已正确申请并获得了存储权限。在鸿蒙系统中,需要在config.json文件中声明存储权限,并在运行时请求用户授权。
  2. PixelMap处理不当

    • 检查PixelMap对象在使用前是否已正确初始化,且在使用完毕后是否已释放资源,避免内存泄漏或资源冲突。
  3. 文件路径或文件名问题

    • 确认保存图片时指定的文件路径是否有效,文件名是否符合系统规范,避免路径不存在或文件名非法导致操作失败。
  4. 系统API使用错误

    • 核实调用保存图片的系统API时参数是否传递正确,包括PixelMap对象、文件路径、文件格式等。
  5. 系统兼容性问题

    • 检查当前鸿蒙系统版本是否与你的应用兼容,有时系统更新可能引入新的API变更或已知问题。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部