ZetCode

处理图像

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