处理图像
最后修改于 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 教程致力于读取和写入图片。