将Blob转换为Go中的图像

时间:2015-04-04 23:29:48

标签: go sqlite blob

我试图在Go中创建一个mbtiles服务器。该文件遵循mbtiles spectile_data字段是BLOB,我试图查询数据库并获取相应的图像(存储为blob类型)。

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

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

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

更新

ÿØÿà个字符是0xFF 0xD8 0xFF 0xE0,它们确实是JPEG文件的开头。我使用通过Mapbox iOS SDK在iOS应用程序中使用的相同MBTile文件,因此文件没有损坏,我实际上可以使用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返回上面提到的4个字节。

更新2: 这是tiles表的一个特定记录的输出。请注意,tile_data字段是BLOB,GUI底部显示4个字符。这是我在Go代码中在[]byte数组中收到的确切内容。

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

Tiles row sample:

enter image description here

平铺字段类型

enter image description here

1 个答案:

答案 0 :(得分:1)

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

此外,数据尚未正确插入数据库。它们的数据类型是TEXT,而不是模式所需的BLOB。您可以在sqlite shell中看到:SELECT typeof(tile_data) FROM tiles;1