在 Go 中将 Blob 转换为图像

Convert Blob to Image in Go

我正在尝试在 Go 中创建一个 mbtiles 服务器。该文件位于 mbtiles spec 之后。 tile_data 字段是一个 BLOB,我正在尝试查询数据库并获取相应的图像(存储为 blob 类型)。

到目前为止查询没问题,但我的 tile_data 结果已损坏。 我不确定如何将 SQLite BLOB 映射到正确的 Go 数据结构。

到目前为止,我尝试使用 var tileData []byte 之后没有成功 github gombtiles sample。 return 值让我得到一个只有 4 个字节的数组,我怀疑这是真的,因为当我在 SQLite GUI 中看到 BLOB 作为文本类型时,它也让我得到 4 个字符(类似于 ÿØÿà

总结一下: tile_data 是一个 BLOB(存储图像),我无法正确转换为 Go var。 我如何在 Go 中将 BLOB 转换为图像?

更新:

ÿØÿà 个字符是 0xFF 0xD8 0xFF 0xE0,它们确实是 JPEG 文件的开头。我使用的 MBTile 文件与我通过 Mapbox iOS SDK 在 iOS 应用程序中使用的文件相同,因此该文件没有损坏,我实际上可以使用 SQLite GUI 查看 BLOB 图像。 MBTiles 规范说该字段是 BLOB 类型,实际上,这就是我正在使用的字段类型。 同样,数据库很好,与外部 iOS 应用程序使用的数据库相同。我什至可以成功查询其他数据。

对于上下文,这是我的孤立代码。

func TilesHandler(w http.ResponseWriter, r *http.Request) {

  db, _ := sql.Open("sqlite3", "./mapSource.mbtiles")
  defer db.Close()

  rows, _ := db.Query("SELECT tile_data FROM tiles WHERE zoom_level = 10 AND tile_column = 309 AND tile_row = 569")
  defer rows.Close()

  var tileData []byte
  for rows.Next() {
    rows.Scan(&tileData)
  }

  w.Write(tileData)
}

为简单起见,缩放和坐标是硬编码的。 tiledata 是 returning 提到的 4 个字节。

更新 2: 这是瓦片的一个特定记录的输出 table。请注意,tile_data 字段是一个 BLOB,GUI 在底部显示了 4 个字符。这正是我在我的 Go 代码的 []byte 数组中收到的那个。

所以我的问题是: 我的数据库中有这个 BLOB 图像文件,它是一个 jpeg 图像。我如何阅读它并将其作为图像显示在我的网页中?我想在我的 http 请求中读取该 BLOB 和 return 图像。

瓷砖行示例:

磁贴字段类型

这是 sqlite3 驱动程序中的错误。它没有正确处理包含 NUL 字符的字符串。现在已修复。

还有数据没有正确插入数据库。它们的数据类型是 TEXT 而不是模式所需的 BLOB。您可以在 sqlite shell 中看到这一点:SELECT typeof(tile_data) FROM tiles;1