将 base64 图像字符串转换为二进制的正确方法?
Proper method of converting base64 image strings to binary?
我在 SQLite 数据库中有一个 table,其中包含大约 15,000 个存储为 base64 字符串的单页文档扫描。如果我理解正确的话,将这些转换为二进制会使 table 的大小减少 25%。
在SQLite中不能直接将图片转为二进制,而base64字符串需要先转图片再转二进制,这样说对吗?如果是这样,从每个 base64 字符串在 Tcl 中创建一个图像并转换为二进制就足够了吗?新手在尝试这样做时是否有任何可能忽略的棘手项目?
当执行下面的测试代码时,img_binary
似乎是二进制数据,但这是正确的做法吗?
谢谢。
set db "database_name"
sqlite3 dbws $db
#Base64 strings in database are prefixed with "data:image/gif;charset=utf-8;base64,"
set l [expr {[string length {data:image/gif;charset=utf-8;base64,}] -1}]
dbws eval { select img_base64 from lexi_raw where img_no = $nbr } {
image create photo ::img::lexi -data [string replace $img_base64 0 $l]
set img_binary [::img::lexi data -format png]; #Does this return binary to be written to SQLite?
puts $img_binary
}
SQLite 没有内置的 base64 解码器,但您可以添加一个。
试试这个:
package require sqlite3
sqlite3 db :memory:
db function base64decode -argcount 1 -deterministic -returntype blob {binary decode base64}
db eval {SELECT base64decode('SGVsbG8sIFdvcmxk') AS message}
诀窍是 function
方法,它创建一个新函数(称为 base64decode
),由给定的 Tcl 脚本片段(binary decode base64
;参数附加为一句话)。我传递 -argcount 1
是因为我们只想在这里传递一个参数,-deterministic
因为相同输入的结果总是相同的,而 -returntype blob
因为我们知道结果是二进制。
如果你想做更复杂的处理(比如去掉前缀)那么最好通过调用过程来实现:
db function base64decode -argcount 1 -deterministic -returntype blob myDecoder
proc myDecoder value {
# Strip a leading prefix
regsub {^data:image/gif;charset=utf-8;base64,} $value "" value
# Decode the rest
return [binary decode base64 $value]
}
我在 SQLite 数据库中有一个 table,其中包含大约 15,000 个存储为 base64 字符串的单页文档扫描。如果我理解正确的话,将这些转换为二进制会使 table 的大小减少 25%。
在SQLite中不能直接将图片转为二进制,而base64字符串需要先转图片再转二进制,这样说对吗?如果是这样,从每个 base64 字符串在 Tcl 中创建一个图像并转换为二进制就足够了吗?新手在尝试这样做时是否有任何可能忽略的棘手项目?
当执行下面的测试代码时,img_binary
似乎是二进制数据,但这是正确的做法吗?
谢谢。
set db "database_name"
sqlite3 dbws $db
#Base64 strings in database are prefixed with "data:image/gif;charset=utf-8;base64,"
set l [expr {[string length {data:image/gif;charset=utf-8;base64,}] -1}]
dbws eval { select img_base64 from lexi_raw where img_no = $nbr } {
image create photo ::img::lexi -data [string replace $img_base64 0 $l]
set img_binary [::img::lexi data -format png]; #Does this return binary to be written to SQLite?
puts $img_binary
}
SQLite 没有内置的 base64 解码器,但您可以添加一个。
试试这个:
package require sqlite3
sqlite3 db :memory:
db function base64decode -argcount 1 -deterministic -returntype blob {binary decode base64}
db eval {SELECT base64decode('SGVsbG8sIFdvcmxk') AS message}
诀窍是 function
方法,它创建一个新函数(称为 base64decode
),由给定的 Tcl 脚本片段(binary decode base64
;参数附加为一句话)。我传递 -argcount 1
是因为我们只想在这里传递一个参数,-deterministic
因为相同输入的结果总是相同的,而 -returntype blob
因为我们知道结果是二进制。
如果你想做更复杂的处理(比如去掉前缀)那么最好通过调用过程来实现:
db function base64decode -argcount 1 -deterministic -returntype blob myDecoder
proc myDecoder value {
# Strip a leading prefix
regsub {^data:image/gif;charset=utf-8;base64,} $value "" value
# Decode the rest
return [binary decode base64 $value]
}