记得画面,忘了文件名:HarmonyOS 7 文搜图怎样帮人找照片
一篇游记写到夜晚的街道,需要配一张有公交车的照片。画面还记得:路灯亮着,车就在道路中间。可打开图库,面对的是一排排缩略图,文件名和拍摄日期都没能提供多少线索。
这类找图任务有一点特别:人记住的往往是照片里的事物、气氛和位置关系,图库保存的却是文件、日期和目录。两边都有信息,表达方式却不一样。图片越多,这个距离就越明显。
HarmonyOS 7 的文搜图,值得关注的正是这一步:让用户用画面描述发起检索。它给图库和素材应用增加了一个新的入口,也带来了一个新的产品问题——一句话找出的候选,用户该怎样确认它真的符合自己的记忆?
一、让照片能被描述找到,改变了什么
官方将这项能力描述为基于文本语义检索图片,接口由 Core Vision Kit 提供。官方 AI 开放能力介绍
这里的“语义”可以从一个具体区别理解:当照片没有写上“公交车”这个标签时,文件名匹配很难提供帮助;文搜图则允许应用用关于画面的文字查询已建立索引的图片。它返回候选结果,应用再把这些结果组织成可浏览的照片。
因此,接入时要同时处理两件事。系统能力负责响应描述与图片之间的检索,应用负责确定搜索范围,以及让人继续判断结果。用户导入哪些照片,就先在这些照片里搜索;接入接口不会让应用自动拥有整个系统相册的访问权。
对旅行相册,这个入口可以是“夜晚有公交车的城市道路”;对设计素材收藏,它可以是“白色咖啡杯放在碟子上”。是否值得接入,取决于用户能否描述目标,以及这批图片是否足够丰富。几十张只靠文件夹就能分清的照片,与长期积累、经常记得画面却忘记出处的收藏,需求并不相同。
二、先让一次找图经历走完整
这次的“拾图”保留了一个很简单的使用过程:导入照片,描述画面,检查候选,再决定是否修改描述。照片列表和搜索框都围绕这条过程展开。
示例准备了30张获许可的照片,包含城市与交通、咖啡与桌面、室内和自然景物。夜景里不只有公交车,还放了街边商店;公交车里也不只有夜景。这样,描述里的每个条件才有机会发挥作用。
先从图库载入示例,切换城市、自然与全部照片,确认这次要搜索的范围。也可以通过右上角加号选择自己的图片。

接着,在搜索框中输入“夜晚的城市”。这一轮返回夜间道路与夜间商店。把描述改成“夜晚有公交车的城市道路”,本轮候选缩小到包含公交车的夜间道路。两句话只增加一个主要条件,变化就容易理解了。

点击“查看原图”,确认完整画面,再返回同一轮搜索。这一步比结果卡片上写“检索成功”更重要:用户真正要完成的是挑出一张可用照片。输入框保留原描述,便于继续修改,也让候选结果有了可追溯的上下文。
以上演示与实验使用 Mate 60 Pro、HarmonyOS 7.0.0.109 / API26;模型能力需在受支持的真机上体验,运行条件见仓库 README。
三、一次没找对的查询,反而更接近实际使用
描述越详细,是不是就一定找得越准?本轮测试没有给出这样简单的答案。
同一批图片中,“夜间城市街道上的公交车”只返回了白天的绿色公交车,预先标注的夜景没有进入候选。它抓住了“公交车”,却没有满足“夜间”。另一条“红色雨伞下的一只猫”在图库里没有对应目标,本轮返回了空列表。
这两种结果直接影响页面该怎样设计。空结果需要告诉用户可以调整描述或更换图库;条件没有全部满足的候选,需要让用户看图,而不是把一个相似度数字包装成确定答案。接口返回的 similarity 也不能直接解释成“找对的概率”。
为了避免只挑好看的例子,这次固定了16条查询,其中15条有相关目标、1条没有。首位命中与前五候选命中都为14/15,未命中就是前述夜间公交车的改写。单次 search 调用耗时31—49ms,中位数37.5ms;这里不包含导入与建库,也不代表首次冷启动或大规模图库的性能。

这组小样本结果支持的判断是:文字描述确实能成为找图入口,但条件组合、改写和否定表达仍需要验证。对于产品,保留“改写描述—重新检索—查看原图”的余地,比承诺一次就找到更实用。
四、从体验往下看,实操要接好哪几步
导入照片之后,检索经历初始化、插入图片、查询、释放服务。工程把它们集中在 visioncore/src/main/ets/RetrievalExperiment.ets,页面只负责提交描述和显示状态。索引与照片文件分开管理:释放服务不等于删除索引,清理索引也不应顺手删除原照片。
从文末仓库导入工程,按 README 完成个人签名和设备配置。先载入30张示例并完成一次查询,再打开该文件查看完整调用。下面摘取运行方法中的建库与查询部分;run 保存本轮记录,checkpoint 在存在时保存阶段进度,完整方法还包含输入校验、失败记录和资源释放:
initialized = await textSearchImage.init();
if (!initialized) {
throw new Error('INITIALIZATION_FAILED');
}
// Use a new scope for each frozen dataset. Never silently clear the user's other scopes.
run.stage = 'insertion';
for (const path of paths) {
run.pendingPath = path;
if (checkpoint) { await checkpoint(run); }
if (!await textSearchImage.insertImage(path, scope)) {
throw new Error('INSERT_FAILED: ' + path);
}
run.insertedPaths.push(path);
run.pendingPath = '';
if (checkpoint) { await checkpoint(run); }
}
run.stage = 'search';
if (checkpoint) { await checkpoint(run); }
for (const query of queries) {
const row = new QueryResult();
row.query = query;
const start = Date.now();
row.images = await textSearchImage.search(query, scope, 5);
row.elapsedMs = Date.now() - start;
run.queries.push(row);
if (checkpoint) { await checkpoint(run); }
}
这里最值得带回自己业务的是两个安排。每轮用 scope 隔离索引,清理时能定位到本轮;插入和查询有明确阶段,失败后能知道问题发生在文件准备、建库还是检索,而不是统一显示“AI暂不可用”。
回到 entry/src/main/ets/pages/Index.ets,搜索框绑定 this.query,提交后走 search(false),实际按钮与输入接线如下。既保留键盘提交,也保留显式搜索按钮,用户输入的内容始终出现在框中。
@Builder
searchField(editable: boolean) {
Row({ space: 10 }) {
Image(this.icon(this.theme === 1 || this.tab === 1 ? 'imgIconSearch' : 'imgIconSearch1')).width(20).height(20)
if (editable) {
TextInput({ placeholder: '描述场景、物体或颜色', text: this.query })
.fontFamily('Noto Sans SC').fontSize(15).fontColor(this.ink()).placeholderColor(this.muted())
.backgroundColor(Color.Transparent).padding(0).layoutWeight(1).height(46).maxLength(100)
.onChange((value: string) => { this.query = value; }).onSubmit(() => { this.search(false); })
} else {
this.label('描述你记得的画面', 15, true)
}
}.padding({ left: 14, right: 14 }).height(48).width('100%')
.backgroundColor(this.surface()).border({ width: 1, color: this.strokeColor() }).borderRadius(12)
.onClick(() => { if (!editable) { this.tab = 1; } })
}
完整的照片导入、结果卡片、索引清理、日志导出和固定查询步骤,保留在开发实操补充。可以先照着运行,再把图片来源替换成自己的素材集合。
五、找图入口变了,结果确认仍然属于人
回到写游记的场景,真正省下来的并不是“点一次按钮”的时间,而是逐张翻图时不断猜测与回忆的过程。用户可以先说出记得的画面,获得少量候选,再把注意力放回照片内容。
这样的能力适合加在素材库、相册收藏和内容创作工具里。接入时应先研究自己的图库:用户通常怎样描述它,哪些条件容易混淆,候选应该怎样呈现。系统提供检索能力,产品要把它接成一个可以反复修正、最终找到所需图片的过程。
相关推荐:
华为开发者联盟-HarmonyOS开发者官网
华为开发者联盟-HarmonyOS开发者官网,共建鸿蒙生态
HarmonyOS 7(API 26) 官方新能力解读 & 开发者实战开发案例合集
HarmonyOS 7(API 26) 官方新能力解读 & 开发者实战开发案例合集
🔗点击查看Harmony Intelligence AI 开放能力深度解读-文搜图:
更多推荐



所有评论(0)