首页 文章

将Blob转换为Go中的图像

提问于
浏览
1

我正在尝试在Go中创建一个mbtiles服务器 . 该文件遵循mbtiles spec . tile_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转换为Image?

UPDATE:

ÿØÿà 字符是 0xFF 0xD8 0xFF 0xE0 ,它们确实是JPEG文件的开头 . 我已经损坏了,我可以使用SQLite GUI实际看到BLOB图像 . MBTiles规范说该字段是BLOB类型,实际上,'s the field type that i' m使用 . 同样,数据库很好,与外部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个字节 .

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

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

Tiles row sample:

enter image description here

Tiles fields types

enter image description here

1 回答

  • 1

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

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

相关问题