HarmonyOS鸿蒙Next中拉起相册并将选择的图片转为PixelMap
HarmonyOS鸿蒙Next中拉起相册并将选择的图片转为PixelMap
将相册选择的图片生成PixelMap
方案一
- 创建图库选择器实例调用select()接口拉起photoPicker界面进行图片选择。图片选择成功后,返回PhotoSelectResult结果集。
- 通过photoAccessHelper模块中的getAssets接口获取媒体文件对应文件的uri。
- 调用getThumbnail获取缩略图。
import { picker } from '@kit.CoreFileKit';
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { dataSharePredicates } from '@kit.ArkData';
import { common } from '@kit.AbilityKit';
const context = getContext(this) as common.UIAbilityContext;
@Entry
@Component
struct WebComponent {
build() {
Column() {
Button('选择图片').onClick(() => {
try {
let uris: Array<string> = [];
let PhotoSelectOptions = new picker.PhotoSelectOptions();
PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
PhotoSelectOptions.maxSelectNumber = 1;
let photoPicker = new picker.PhotoViewPicker();
photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: picker.PhotoSelectResult) => {
console.info('photoPicker.select successfully, PhotoSelectResult uri: ' + JSON.stringify(PhotoSelectResult));
uris = PhotoSelectResult.photoUris;
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);
let predicates: dataSharePredicates.DataSharePredicates = new dataSharePredicates.DataSharePredicates();
/// 使用PhotoViewPicker选择图片返回的uri进行查询
predicates.equalTo('uri', uris[0]);
let fetchOptions: photoAccessHelper.FetchOptions = {
fetchColumns: [],
predicates: predicates
};
phAccessHelper.getAssets(fetchOptions, async (err, fetchResult) => {
if (fetchResult !== undefined) {
console.info('fetchResult success');
let photoAsset: photoAccessHelper.PhotoAsset = await fetchResult.getFirstObject();
if (photoAsset !== undefined) {
// 获取缩略图
photoAsset.getThumbnail((err, pixelMap) => {
if (err == undefined) {
console.info('getThumbnail successful ' + JSON.stringify(pixelMap));
} else {
console.error('getThumbnail fail', err);
}
});
console.info('photoAsset.displayName : ' + photoAsset.displayName);
}
} else {
console.error(`fetchResult fail with error: ${err.code}, ${err.message}`);
}
});
}).catch((err: BusinessError) => {
console.error('photoPicker.select failed with err: ' + JSON.stringify(err));
});
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error('photoPicker failed with err: ' + JSON.stringify(err));
}
})
}
}
}
方案二
- 创建图库选择器实例调用select()接口拉起photoPicker界面进行图片选择。图片选择成功后,返回PhotoSelectResult结果集。
- 待界面从图库返回后,使用fs.openSync接口,通过uri打开这个文件得到fd。这里需要注意接口权限参数是fs.OpenMode.READ_ONLY。
- 通过image使用image.createImageSource接口创建图片源实例。
- 然后根据imageSource创建pixelMap。
import { photoAccessHelper } from '@kit.MediaLibraryKit';
import { BusinessError } from '@kit.BasicServicesKit';
import { image } from '@kit.ImageKit';
import { picker } from '@kit.CoreFileKit';
import { fileIo } from '@kit.CoreFileKit';
@Entry
@Component
struct WebComponent {
build() {
Column() {
Button('选择图片').onClick(() => {
try {
let uris: Array<string> = [];
let PhotoSelectOptions = new picker.PhotoSelectOptions();
PhotoSelectOptions.MIMEType = picker.PhotoViewMIMETypes.IMAGE_TYPE;
PhotoSelectOptions.maxSelectNumber = 1;
let photoPicker = new picker.PhotoViewPicker();
photoPicker.select(PhotoSelectOptions).then((PhotoSelectResult: photoAccessHelper.PhotoSelectResult) => {
uris = PhotoSelectResult.photoUris;
let file = fileIo.openSync(uris[0], fileIo.OpenMode.READ_ONLY);
console.info('file fd: ' + file.fd);
let buffer = new ArrayBuffer(4096);
let readLen = fileIo.readSync(file.fd, buffer);
console.info('readSync data to file succeed and buffer size is:' + readLen);
const imageSource: image.ImageSource = image.createImageSource(file.fd);
let decodingOptions: image.DecodingOptions = {
editable: true,
desiredPixelFormat: 3,
}
imageSource.createPixelMap(decodingOptions, (err: BusinessError, pixelMap: image.PixelMap) => {
if (err !== undefined) {
console.error(`Failed to create pixelMap.code is ${err.code},message is ${err.message}`);
} else {
console.info('Succeeded in creating pixelMap object.');
}
})
}).catch((err: BusinessError) => {
console.error(`Invoke photoPicker.select failed, code is ${err.code}, message is ${err.message}`);
})
} catch (error) {
let err: BusinessError = error as BusinessError;
console.error('photoPicker failed with err: ' + JSON.stringify(err));
}
})
}
}
}
更多关于HarmonyOS鸿蒙Next中拉起相册并将选择的图片转为PixelMap的实战教程也可以访问 https://www.itying.com/category-93-b0.html
2 回复
在HarmonyOS Next中,可以通过photoAccessHelper
模块拉起相册。使用PhotoViewPicker
选择图片后,获取到选中图片的URI。然后通过image
模块的createImageSource
方法创建ImageSource
对象,传入图片URI。最后调用ImageSource
的createPixelMap
方法生成PixelMap
对象。关键代码:
let photoPicker = new photoAccessHelper.PhotoViewPicker();
let photoSelectOptions = new photoAccessHelper.PhotoSelectOptions();
let result = await photoPicker.select(photoSelectOptions);
let imageSource = image.createImageSource(result.photoUris[0]);
let pixelMap = await imageSource.createPixelMap();
更多关于HarmonyOS鸿蒙Next中拉起相册并将选择的图片转为PixelMap的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS Next中,将相册选择的图片转为PixelMap的两种方案都是可行的,但各有特点:
方案一通过getThumbnail获取的是缩略图,适合快速显示预览场景,但分辨率较低。
- 使用PhotoViewPicker选择图片
- 通过photoAccessHelper获取媒体资源
- 调用getThumbnail直接获取PixelMap
方案二通过createImageSource创建完整分辨率PixelMap,适合需要原图画质的场景。
- 同样使用PhotoViewPicker选择图片
- 通过fileIo打开文件获取文件描述符
- 使用image.createImageSource创建图像源
- 调用createPixelMap生成完整PixelMap
建议根据实际需求选择:
- 需要快速显示预览时用方案一
- 需要原图画质处理时用方案二
两种方案都正确处理了权限和错误情况,是标准的实现方式。