gpt4 book ai didi

go - 在 Go 中将 Blob 转换为图像

转载 作者:IT王子 更新时间:2023-10-29 02:16:10 26 4
gpt4 key购买 nike

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

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

到目前为止,我尝试使用 var tileData []byte 之后没有成功 github gombtiles sample .返回值让我得到一个只有 4 个字节的数组,我怀疑这是真的,因为当我在 SQLite GUI 中看到 BLOB 作为文本类型时,它也让我得到 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 请求中返回一个图像。

瓷砖行示例:

enter image description here

磁贴字段类型

enter image description here

最佳答案

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

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

关于go - 在 Go 中将 Blob 转换为图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29452538/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com