处理图像
最后修改于 2020 年 7 月 6 日
在本 SQLite Ruby 教程的这一章中,我们将处理图片文件。请注意,有些人反对将图片放入数据库。这里我们仅展示如何操作。我们不会深入探讨是否将图片保存在数据库中的技术问题。
sqlite> CREATE TABLE Images(Id INTEGER PRIMARY KEY, Data BLOB);
对于这个例子,我们创建一个名为 Images 的新表。对于图片,我们使用 BLOB 数据类型,它代表二进制大对象 (Binary Large Object)。
插入图像
在第一个例子中,我们将向 SQLite 数据库插入一张图片。
#!/usr/bin/ruby
require 'sqlite3'
begin
fin = File.open "woman.jpg" , "rb"
img = fin.read
rescue SystemCallError => e
puts e
ensure
fin.close if fin
end
begin
db = SQLite3::Database.open 'test.db'
blob = SQLite3::Blob.new img
db.execute "INSERT INTO Images VALUES(1, ?)", blob
rescue SQLite3::Exception => e
puts "Exception occurred"
puts e
ensure
db.close if db
end
我们从当前工作目录读取一张图片,并将其写入 SQLite test.db 数据库的 Images 表中。
fin = File.open "woman.jpg" , "rb" img = fin.read
我们打开并读取一张 JPG 图片。read 方法将数据作为字符串返回。
blob = SQLite3::Blob.new img
我们创建 SQLite3::Blob 类的实例。它用于处理二进制数据。
db.execute "INSERT INTO Images VALUES(1, ?)", blob
图片被写入数据库。
读取图像
在本节中,我们将执行相反的操作。我们将从数据库表中读取一张图像。
#!/usr/bin/ruby
require 'sqlite3'
begin
db = SQLite3::Database.open 'test.db'
data = db.get_first_value "SELECT Data FROM Images LIMIT 1"
f = File.new "woman2.jpg", "wb"
f.write data
rescue SQLite3::Exception, SystemCallError => e
puts "Exception occurred"
puts e
ensure
f.close if f
db.close if db
end
我们从 Images 表中读取图片数据,并将其写入另一个文件,我们称之为 woman2.jpg。
data = db.get_first_value "SELECT Data FROM Images LIMIT 1"
这行代码从表中选择图片数据。
f = File.new "woman2.jpg", "wb" f.write data
我们打开一个新的图片文件,并将检索到的数据写入该文件。然后我们关闭文件。
这部分 SQLite Ruby 教程致力于读取和写入图片。