【问题标题】:How to search colors when colors are stored as hexadecimal or RGB value?当颜色存储为十六进制或 RGB 值时如何搜索颜色?
【发布时间】:2021-09-22 13:32:24
【问题描述】:

背景:
我们使用Vision API 来检测图像的颜色属性。颜色值作为 RGB 值存储在数据库中。我们希望用户在我们的网络应用程序中搜索颜色。

场景:
我希望用户能够搜索颜色或从下拉列表中选择颜色。结果将显示在页面上。但据我所知,我们可以通过使用文本或数字来制作搜索功能。

数据库:
我在服务器端使用 firebase firestore 和 firebase-admin。我收到颜色作为 RGB 值的响应。我在数据库中存储颜色的 RBG 值。

问题是我们如何使用 RGB 值或十六进制值进行搜索?

更新 1:

示例:
1:用户上传图像,提取颜色并存储在firestore中。
2:所以,如果用户想要搜索,他会输入红色、绿色、蓝色等。只有有限的颜色名称link。 (约 140 人)
3:用户只能搜索 140 个颜色名称(我猜)。但会有数百万种颜色组合
4:有一点是肯定的,不能在每种情况下都返回确切的颜色。
5:那么,如何返回最接近的颜色。

【问题讨论】:

标签: node.js reactjs firebase search


【解决方案1】:

Firebase 有两个不同的数据库,即 Realtime DatabaseFirestore。我不确定您使用的是哪一个,但我认为 Firestore 是理想的。

让我们分小步进行分解:

1.使用 Cloud Vision API 并添加到 Firestore:

您可以在您的云功能、服务器或您使用它的任何地方使用 Cloud Vision API 处理您的图像,然后将数据添加到 Firestore。

//... process image
const colors = ["FF0000", "00FF00", "0000FF"]
// Assume colors is an array of hex codes of colors found in that image
// Add the image data in Firestore

await admin.firestore().collection("images").add({
  path: "path/in/storage",
  colors,
  ...otherMetaData
})

确保您添加了该图像的颜色数组和路径或 URL(只是用于定位图像存储位置的标识符)。

2。查询用户输入颜色的图片:

// Add your color picker 
const color = "FF0000" // color chosen by the user

// Make a query to Firestore from client
const snapshot = await firebase.firestore().collection("images").where("colors", "array-contains", color).get()

const images = snapshot.docs.map((img) => img.path)

现在您有一个包含用户选择颜色的图像 URL 数组。您可以类似地添加 RGBA 或 HSL 值。

【讨论】:

  • 用户将作为文本搜索颜色,如何处理?
  • @PingPong 你必须从你的反应颜色选择器组件中获取十六进制
  • 如果我们有十六进制值或任何颜色变体,我们可以搜索最接近的颜色
  • @PingPong 直接查询是不可能的。我不确定将十六进制转换为十进制然后存储在数据库中,然后使用大于或小于运算符进行查询是否有帮助。
【解决方案2】:

对于 Firestore 而言,搜索给定颜色值的最接近匹配项可能会很棘手。如果您只想让您的用户从列表中选择颜色名称(红色、蓝色、绿色等),您可以将从 Vision 获得的值转换为名称并将其存储在 firestore 文档中。这样您就可以查询字符串值。如果您有多个颜色值,您也可以将它们存储在一个数组中并针对数组值进行查询。

https://www.npmjs.com/package/hex-color-to-color-name

【讨论】:

  • 会有很多颜色组合。仅存储有限的颜色无济于事,因为图像中红色的可能性非常罕见。平均而言,不是每个人都会使用红色,它必须是一些变体,更暗,更亮等。
  • 这取决于您的工作环境。汽车或 T 恤可以是深红色或浅绿色。从 Vision API 获取十六进制后,您可以将其转换为最接近的颜色名称。这些是此示例中颜色“红色”的变体。因此,用户可以搜索红色汽车并看到深红色的汽车。其他颜色的组合也可以。但是,如果您想区分浅红色和深红色之间的搜索,这在您的上下文中并不理想。
  • 如何将颜色转换为其变体?如果可能的话,我可以将其存储到文档中,并可以根据用户搜索请求返回!
  • 我没有使用上面共享的库,但它应该返回最接近的颜色名称。因此,如果您使用十六进制值输入它(假设它是深红色),它将返回红色。可能有另一个库可以获得更详细的结果。
猜你喜欢
  • 1970-01-01
  • 2018-10-22
  • 1970-01-01
  • 2022-08-10
  • 1970-01-01
  • 2016-12-27
  • 2011-07-30
  • 2013-06-01
  • 2014-04-25
相关资源
最近更新 更多