在 OpenHarmony 里给条形码(一维码 / 二维码)“加 logo”,本质上和在其他平台一样:先生成条码图像,再把 logo 叠加绘制到图像中心。OpenHarmony 目前主要用 ArkTS + Canvas 来实现。
下面分几种常见情况说明。
可以使用第三方库(如 qrcode 的 ArkTS 移植版)或后端生成。
假设已经拿到条码的 PixelMap / ImageSource。
import image from '@ohos.multimedia.image'
import { canvas } from '@ohos.graphics.canvas'
@Entry
@Component
struct BarcodeWithLogo {
private canvasContext: CanvasRenderingContext2D | null = null
build() {
Column() {
Canvas(this.canvasContext)
.width(300)
.height(300)
.onReady(async (ctx: CanvasRenderingContext2D) => {
this.canvasContext = ctx
await this.drawBarcodeWithLogo()
})
}
}
async drawBarcodeWithLogo() {
const ctx = this.canvasContext!
// 1. 画条码
const barcodeImage = await this.getBarcodePixelMap()
ctx.drawImage(barcodeImage, 0, 0, 300, 300)
// 2. 画 Logo
const logoImage = await this.getLogoPixelMap()
const logoSize = 60
ctx.drawImage(
logoImage,
120, // (300-60)/2
120,
logoSize,
logoSize
)
// 可选:画白色圆底
ctx.fillStyle = '#FFFFFF'
ctx.beginPath()
ctx.arc(150, 150, 35, 0, Math.PI * 2)
ctx.fill()
}
async getBarcodePixelMap(): Promise<image.PixelMap> {
// 从资源或接口获取
return image.createPixelMap(/* ... */)
}
async getLogoPixelMap(): Promise<image.PixelMap> {
return image.createPixelMap(/* ... */)
}
}
✅ 优点:完全可控,支持任意条码类型
❌ 缺点:需要自己处理图像
适合 静态条码图片 + logo
Stack() {
Image($r('app.media.barcode'))
.width(300)
.height(300)
Image($r('app.media.logo'))
.width(60)
.height(60)
}
✅ 最简单
❌ 不支持动态生成条码
条码 + logo 由服务端生成(Java / Python / Node):
ZXingqrcode + PILOpenHarmony 只负责展示:
Image('https://xxx.com/barcode.png')
✅ 稳定、跨平台
✅ 不占端上性能
PixelMap 时注意释放资源你可以告诉我:
我可以给你可直接跑的示例代码。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。