在 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
我正在尝试在 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