Rust程式語言雖然已經發展了好幾年的時間了,但對於圖片處理還是沒有好用的以純Rust或是純Rust+libc來開發的函式庫,雖然在crates.io上有image
這個套件,但它的格式支援度還很有限。因此為了讓Rust程式能夠擁有強大的圖片處理能力,現階段還是必須使其與ImageMagick等歷史悠久的C語言函式庫來進行綁定,才能實現出功能完整且效能優良的圖片處理程式。
image-convert
「Image Convert」是筆者開發的套件,利用ImageMagick的MagickWand API來實現出高階的圖片資訊查看、高品質縮放、交錯化與格式轉換的函數。
Crates.io
Cargo.toml
使用方法
查看圖片資訊
利用image_convert
這個crate所提供的identify
函數,可以快速取得一張圖片的格式、尺寸以及其交錯化的方式。
例如:
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格式,程式如下:
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
(如BMP、JPG、PNG、GIF、WEBP、ICO和GrayRaw)都有其專屬的XXXConfig
和to_xxx
等函數可以使用。一開始可以先產生XXXConfig
的結構實體,並且設定好結構實體的欄位。接著建立出兩個ImageResource
結構實體,來指定圖片的輸入來源和輸出目的地,可以是檔案路徑或是Vec<u8>
結構實體。最後再呼叫to_xxx
函數來處理即可。
在預設的情況下,當圖片需要進行縮放時,這個套件還會自動進行不同程度的圖片銳化,使得圖片看起來品質更好。當然,藉由編輯XXXConfig
結構實體的sharpen
欄位,是可以手動控制銳化程度的。