HarmonyOS 鸿蒙Next 图片压缩API使用时报错ImageSource mismatch
HarmonyOS 鸿蒙Next 图片压缩API使用时报错ImageSource mismatch 如题,我使用PhotoPicker选取一张图片,然后在回调中获取了被选择图片的uri,传入imagePacker的packing方法中,无法正常图片压缩
若图片为PhotoPicker选择的图片,就报错ImageSource mismatch。若图片为rawfile中的图片,就报错undefined
我已经排除掉的可能:
- 权限。因为是借助PhotoPicker临时授权访问图片,压缩后的图片也无需写入文件系统,所以无需申请任何权限。
- 在图片选择的回调中处理。使用Picker选择媒体库资源-Media Library Kit(媒体文件管理服务)-媒体 - 华为HarmonyOS开发者 (huawei.com)
已经依照文档要求保存图片uri,然后在其他事件中使用uri了,无论我是按照文档要求,还是直接在回调中处理,都是一样的报错
以下是我的代码片段,麻烦用过的大佬帮忙看看问题可能出在哪里:
- 选择图片
- 图片压缩
public static async compressImage(uri: string, resourceManager: resourceManager.ResourceManager) {
const imageSource = image.createImageSource(uri)
const option: image.PackingOption = {
format: 'image/png',
quality: 80
}
const imagePacker = image.createImagePacker()
imagePacker.packing(imageSource, option, (error: BusinessError, data: ArrayBuffer) => {
if (error) {
;
}
})
const packer2 = image.createImagePacker()
const fd = resourceManager.getRawFdSync('abc.png')
const imageSource2 = image.createImageSource(fd)
packer2.packing(imageSource2, option, (error: BusinessError, data: ArrayBuffer) => {
if (error) {
;
}
})
}
更多关于HarmonyOS 鸿蒙Next 图片压缩API使用时报错ImageSource mismatch的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
要拷贝到沙箱再上传
更多关于HarmonyOS 鸿蒙Next 图片压缩API使用时报错ImageSource mismatch的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
和沙箱有关系,但是和这个上传的关系不大,是通过uri来createImageSource,有这个沙箱的限制,详见2楼,
找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17
问题终结,是我加班加到脑子不清楚了,第二个压缩rawfile中的文件其实已经成功了,error是undefind就是成功
受此启发,第一个压缩选择的图片,也仿照这个实现,先打开文件获取fd,再用fd创建imageSource即可。这个压缩不成功的原因是createImageSource(uri: string): ImageSource 仅支持应用沙箱路径,通过系统选择器临时授权的文件在下载文件夹中,不在应用自己的沙箱内。通过fd创建则没有这个限制。
在HarmonyOS鸿蒙Next中使用图片压缩API时,出现ImageSource mismatch
错误,通常是由于传入的图片源与API期望的格式不匹配。鸿蒙Next的图片压缩API要求传入的图片源必须是ImageSource
类型,且该图片源需要符合特定的格式或状态。
ImageSource
是鸿蒙系统中用于表示图片数据的类,它可以从文件、资源、网络等多种来源加载图片。如果传入的图片源不是ImageSource
类型,或者图片源的状态不符合API的要求(例如图片未正确加载或解码),就会抛出ImageSource mismatch
错误。
要解决此问题,首先确保传入的图片源是通过ImageSource
类正确创建的。例如,使用ImageSource.createFromFile()
或ImageSource.createFromResource()
等方法生成ImageSource
对象。其次,确保图片源在传入API之前已经成功加载和解码。可以通过检查ImageSource
的状态或使用ImageSource.getImageInfo()
方法验证图片信息。
如果图片源是从网络加载的,确保网络请求已完成且图片数据完整。如果图片源是从文件加载的,确保文件路径正确且文件存在。如果图片源是从资源加载的,确保资源ID正确且资源可用。
总之,ImageSource mismatch
错误的核心在于图片源的类型或状态不符合API要求,需确保传入的图片源是有效的ImageSource
对象且已正确加载。
在HarmonyOS鸿蒙Next中使用图片压缩API时,出现“ImageSource mismatch”错误,通常是由于传入的图片资源类型不匹配导致的。请检查以下几点:
- 资源类型:确保传入的图片资源是
ImageSource
类型,而不是其他类型(如PixelMap
或Resource
)。 - 资源路径:确认图片路径正确,且资源文件存在。
- API调用:检查API调用方式,确保参数传递正确。
示例代码:
ImageSource imageSource = ImageSource.create("path/to/image.jpg", null);
ImagePacker imagePacker = ImagePacker.create();
imagePacker.pack(imageSource, "path/to/output.jpg", new PackOptions());
如果问题仍未解决,建议查阅官方文档或社区支持。