العمل مع الصور في Rust: من التحميل إلى التصفية
Rust هي لغة نظام حديثة تكتسب شعبية ليس فقط في تطوير الويب وبرمجة الأنظمة، ولكن أيضًا في مجال معالجة الوسائط المتعددة. بفضل أدائها وأمانها، تعتبر Rust مثالية للمهام المتعلقة بالصور. في هذه المقالة، سنستعرض المكتبات والأدوات الرئيسية التي تتيح العمل بكفاءة مع الرسومات النقطية.
المكتبة الأساسية: image
مكتبة image هي المعيار الفعلي للعمل مع الصور في نظام Rust البيئي. تدعم العشرات من التنسيقات (PNG، JPEG، GIF، BMP، WebP، TIFF وغيرها) وتوفر واجهة برمجة تطبيقات مريحة لتحميل الصور ومعالجتها وحفظها.
التثبيت — أضف إلى Cargo.toml:
[dependencies]image = "0.25"تحميل وحفظ الصور
لنستعرض العمليات الأساسية: فتح ملف، تغيير الحجم، والحفظ بتنسيق آخر.
use image::{DynamicImage, GenericImageView};use std::path::Path;
fn main() { // تحميل الصورة let img = image::open("input.jpg").expect("فشل فتح الملف");
// عرض المعلومات println!("الحجم: {}x{}", img.width(), img.height()); println!("الوضع اللوني: {:?}", img.color());
// تغيير الحجم إلى 200x200 (مع الحفاظ على النسب) let resized = img.resize(200, 200, image::imageops::FilterType::Lanczos3);
// الحفظ بصيغة PNG resized.save("output.png").expect("خطأ في الحفظ");}العمليات الأساسية للمعالجة
توفر مكتبة image وحدة imageops مع مجموعة من الفلاتر والتحويلات الجاهزة.
- التدوير والقلب:
use image::DynamicImage;
fn rotate_and_flip(img: &DynamicImage) { // تدوير 90 درجة في اتجاه عقارب الساعة let rotated = img.rotate90(); // قلب أفقي let flipped = img.fliph(); // قلب عمودي let flipped_v = img.flipv();}- القص (crop):
fn crop_example(img: &DynamicImage) { // قص مستطيل: x=50, y=30, العرض=200, الارتفاع=150 let cropped = img.crop_imm(50, 30, 200, 150); cropped.save("cropped.png").unwrap();}- تعديل السطوع والتباين:
fn adjust_brightness(img: &DynamicImage) { // زيادة السطوع بمقدار 50 (يمكن أن تكون القيمة سالبة) let brighter = image::imageops::brighten(img, 50); // زيادة التباين let contrasted = image::imageops::contrast(img, 1.5);}الفلاتر والتأثيرات
تتضمن المكتبة عدة فلاتر مدمجة. إليك أمثلة على أكثرها فائدة:
use image::imageops::FilterType;
fn apply_filters(img: &DynamicImage) { // التمويه الغاوسي (sigma = 2.0) let blurred = image::imageops::blur(img, 2.0);
// زيادة الحدة let sharpened = image::imageops::unsharpen(img, 5.0, 2);
// التحويل إلى تدرج الرمادي let gray = img.grayscale();
// تطبيق مرشح العتبة (التحويل الثنائي) let threshold = image::imageops::threshold(img, 128);
// حفظ جميع النتائج blurred.save("blurred.png").unwrap(); sharpened.save("sharpened.png").unwrap(); gray.save("gray.png").unwrap();}العمل المباشر مع البكسلات
إذا كنت بحاجة إلى تحكم كامل في كل بكسل، تتيح المكتبة الوصول إلى البيانات الخام:
use image::Rgba;
fn pixel_manipulation(mut img: image::RgbaImage) { for pixel in img.pixels_mut() { // عكس الألوان pixel[0] = 255 - pixel[0]; // أحمر pixel[1] = 255 - pixel[1];