// Keep the original code provided by the user intact here import { photoAccessHelper } from '@kit.MediaLibraryKit' import { fileIo } from '@kit.CoreFileKit' import image from '@ohos.multimedia.image' import { subjectSegmentation } from '@kit.CoreVisionKit' import { promptAction } from '@kit.ArkUI'
@Entry @ComponentV2 struct SubjectSegmentation { @Local chooseImage?: PixelMap @Local segmentedImage?: PixelMap @Local bgColor: ResourceColor = Color.White
async segmentImage() {
if (canIUse('SystemCapability.AI.Vision.SubjectSegmentation')) {
const photoPicker: photoAccessHelper.PhotoViewPicker = new photoAccessHelper.PhotoViewPicker();
const photoResult = await photoPicker.select({
MIMEType: photoAccessHelper.PhotoViewMIMETypes.IMAGE_TYPE,
maxSelectNumber: 1
})
const photoUri = photoResult.photoUris[0]
const fileSource = await fileIo.open(photoUri, fileIo.OpenMode.READ_ONLY);
const imageSource = image.createImageSource(fileSource.fd);
this.chooseImage = await imageSource.createPixelMap();
const visionInfo: subjectSegmentation.VisionInfo = {
pixelMap: this.chooseImage,
};
try {
const result = await subjectSegmentation.doSegmentation(visionInfo, {
enableSubjectForegroundImage: true
})
this.segmentedImage = result.fullSubject.foregroundImage
} catch (e) {
promptAction.showToast({ message: e.message })
}
}
}
build() {
Column({ space: 20 }) {
Text('Original Image:')
Image(this.chooseImage)
.objectFit(ImageFit.Fill)
.height('30%')
Text('Background Removed:')
Image(this.segmentedImage)
.objectFit(ImageFit.Fill)
.height('30%')
.backgroundColor(this.bgColor)
Button('Select Image')
.onClick(() => this.segmentImage())
Button('Change Background')
.onClick(() => {
const a = Math.round(Math.random() * 255)
const b = Math.round(Math.random() * 255)
const c = Math.round(Math.random() * 255)
this.bgColor = `rgb(${a},${b},${c})`
})
}
.padding(15)
.height('100%')
.width('100%')
}
}