HarmonyOS 鸿蒙Next PixelMap 创建失败
HarmonyOS 鸿蒙Next PixelMap 创建失败
通过本地文件的图片( /data/storage/el2/base/haps/entry/files/2/8/keyImg/2410 )创建PixelMap失败,请问是什么原因 Create PixelMap error
文件在压缩包中
public static async removeByte(filePath: string): Promise<PixelMap | null> {
if (!fs.accessSync(filePath)) {
return null;
}
let buf: ArrayBuffer = new ArrayBuffer(0)
try {
// 打开文件流
let inputStream = fs.createStreamSync(filePath, 'r+');
let bufSize = fs.statSync(filePath).size;
buf = new ArrayBuffer(bufSize);
class Option {
public offset: number = 0;
public length: number = bufSize;
}
let option = new Option();
let readLen = inputStream.readSync(buf, option);
// 关闭文件流
inputStream.closeSync();
} catch (e) {
console.log(`错误:${e}`)
}
let imageSource: image.ImageSource = image.createImageSource(buf);
class tmp {
height: number = 100
width: number = 100
}
let options: Record<string, number | boolean | tmp> = {
'alphaType': 0, // 透明度
'editable': false, // 是否可编辑
'pixelFormat': 3, // 像素格式
'scaleMode': 1, // 缩略值
'size': { height: 100, width: 100 }
} // 创建图片大小
let res: PixelMap | null = null;
try {
res = await imageSource.createPixelMap(options);
} catch (e) {
console.log("1")
}
return res;
}
更多关于HarmonyOS 鸿蒙Next PixelMap 创建失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
参考demo 通过image.createImageSource(uri) 创建图片源实例时,uri仅支持应用沙箱路径;
也可以通过image.createImageSource(fd),通过传入文件描述符来创建图片源实例;
通过传入文件描述符来创建图片源实例
let imageSource: image.ImageSource = image.createImageSource(file.fd);
let imageInfo: image.ImageInfo = await imageSource.getImageInfo();
let pixelMap: image.PixelMap = await imageSource.createPixelMap();
关于image.createImageSource(fd)的使用可参考官方文档: https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V5/js-apis-image-V5#imagecreateimagesource
import image from '@ohos.multimedia.image';
import fs from '@ohos.file.fs';
const context: Context = getContext();
@Entry
@Component
struct Index {
context = getContext(this);
@State pixmap: PixelMap | undefined = undefined;
aboutToAppear(): void {
context.resourceManager.getRawFileContent('food.png', (_err, value) => {
let myBuffer: ArrayBufferLike = value.buffer
let file = fs.openSync(context.filesDir + "/food.png", fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
let writeLen = fs.writeSync(file.fd, myBuffer);
console.info("写入数据和文件成功:" + writeLen);
fs.closeSync(file);
});
}
build() {
Row() {
Column() {
Button('沙箱图片转PixelMap')
.margin({ bottom: 20 })
.onClick(async () => {
let filePath = context.filesDir + "/food.png";
try {
let file = fs.openSync(context.filesDir + "/food.png", fs.OpenMode.READ_WRITE);
let buf = new ArrayBuffer(4096);
fs.readSync(file.fd, buf);
// 获取resourceManager资源管理器
const resourceMgr = this.context.resourceManager;
// 获取rawfile文件夹下icon.png的ArrayBuffer。
const fileData = await resourceMgr.getRawFileContent("food.png");
// 获取图片的ArrayBuffer
const buffer = fileData.buffer;
// 创建imageSource。
const imageSource = image.createImageSource(filePath);
// 创建PixelMap
this.pixmap = await imageSource.createPixelMap();
} catch (err) {
}
})
Image(this.pixmap)
.height(60)
.width(60)
.objectFit(ImageFit.Contain)
}
.width('100%')
}
.height('100%')
}
}
更多关于HarmonyOS 鸿蒙Next PixelMap 创建失败的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS中,如果遇到Next PixelMap创建失败的问题,通常涉及资源加载或内存分配异常。具体排查步骤如下:
-
资源文件检查:
- 确认PixelMap资源文件是否存在且路径正确。
- 检查资源文件是否损坏或格式不支持。
-
内存与性能:
- 评估当前系统内存使用情况,确保有足够的内存来加载新的PixelMap。
- 检查是否存在内存泄漏导致资源分配失败。
-
加载方式:
- 确认是否使用了正确的加载方法,如
PixelMapFactory.DecodeFile
等。 - 如果使用了异步加载,确保回调处理正确且没有异常中断。
- 确认是否使用了正确的加载方法,如
-
权限问题:
- 检查应用是否已获取读取资源文件的必要权限。
-
日志与异常:
- 查看系统日志,定位创建PixelMap失败时的具体错误信息。
- 分析异常堆栈,找出导致问题的代码位置。
-
代码检查:
- 复查PixelMap创建代码,确保逻辑正确且符合HarmonyOS API规范。
如果上述步骤均未能解决问题,可能是系统或框架层面的bug。此时,请尝试重启设备或更新HarmonyOS系统至最新版本。如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html