Rust程式語言雖然已經發展了好幾年的時間了,但對於圖片處理還是沒有好用的以純Rust或是純Rust+libc來開發的函式庫,雖然在crates.io上有image這個套件,但它的格式支援度還很有限。因此為了讓Rust程式能夠擁有強大的圖片處理能力,現階段還是必須使其與ImageMagick等歷史悠久的C語言函式庫來進行綁定,才能實現出功能完整且效能優良的圖片處理程式。



image-convert

「Image Convert」是筆者開發的套件,利用ImageMagick的MagickWand API來實現出高階的圖片資訊查看、高品質縮放、交錯化與格式轉換的函數。

Crates.io

https://crates.io/crates/image-convert

Cargo.toml

image-convert = "*"

使用方法

查看圖片資訊

利用image_convert這個crate所提供的identify函數,可以快速取得一張圖片的格式、尺寸以及其交錯化的方式。

例如:

extern crate image_convert;

use image_convert::{ImageResource, InterlaceType, identify};

let input = ImageResource::from_path("tests/data/P1060382.JPG");

let mut output = None;

let id = identify(&mut output, &input).unwrap();

assert_eq!(4592, id.resolution.width);
assert_eq!(2584, id.resolution.height);
assert_eq!("JPEG", id.format);
assert_eq!(InterlaceType::NoInterlace, id.interlace);

在使用identify函數時,第一個參數要傳入一個Option列舉的可變參考,通常會傳入None的可變參考,表示不要讀取完整的圖片,只讀取圖片資訊,如此一來可以省下很多讀取時間。不過如果想要同時讀取圖片的影像資料和圖片資訊的話,第一個參數可以傳入Some(None),在成功執行identify函數後,Some(None)就會被改為Some(Some(image_convert::magick_rust::MagickWand)),接著我們就可以用這個MagickWand實體來對圖片進行低階的處理啦!這部份要參考magick_rust這個crate的用法。

縮放、交錯化與格式轉換

圖片的縮放、交錯化與格式轉換可以透過image_convert這個crate在一個函數內完成。例如要將一張圖片,進行縮放並轉成PNG格式,程式如下:

extern crate image_convert;

use std::path::Path;

use image_convert::{ImageResource, PNGConfig, to_png};

let source_image_path = Path::new("tests/data/P1060382.JPG");

let target_image_path = Path::join(source_image_path.parent().unwrap(), "P1060382_output.png");

let mut config = PNGConfig::new();

config.width = 1920;

let input = ImageResource::from_path(source_image_path);

let mut output = ImageResource::from_path(target_image_path);

to_png(&mut output, &input, &config).unwrap();

簡單來說,每種轉出格式XXX(如JPG、PNG、GIF、WEBP、ICO和GrayRaw)都有其專屬的XXXConfigto_xxx等函數可以使用。一開始可以先產生XXXConfig的結構實體,並且設定好結構實體的欄位。接著建立出兩個ImageResource結構實體,來指定圖片的輸入來源和輸出目的地,可以是檔案路徑或是Vec<u8>結構實體。最後再呼叫to_xxx函數來處理即可。

在預設的情況下,當圖片需要進行縮放時,這個套件還會自動進行不同程度的圖片銳化,使得圖片看起來品質更好。當然,藉由編輯XXXConfig結構實體的sharpen欄位,是可以手動控制銳化程度的。