مكتبة image في Rust: دليل شامل مع أمثلة

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مكتبة image في Rust: دليل شامل

مكتبة image هي المكتبة الأساسية والأكثر شيوعًا للتعامل مع الصور في نظام Rust البيئي. توفر مجموعة أدوات قوية وآمنة وعالية الأداء لتحميل ومعالجة وتحليل وحفظ الصور النقطية. على عكس نظيراتها في C/C++، فإن image مكتوبة بلغة Rust الخالصة، مما يضمن أمان الذاكرة وعدم وجود تسربات للذاكرة التي تميز المكتبات منخفضة المستوى.

لماذا تحتاج هذه المكتبة؟ في عالم اليوم، أصبحت معالجة الصور مطلوبة في كل مكان: من خدمات الويب (إنشاء صور مصغرة، إضافة علامات مائية) إلى تطبيقات سطح المكتب (برامج تحرير الصور، عارضات الصور) وحتى الأنظمة المضمنة (الرؤية الحاسوبية على Raspberry Pi). تتيح لك image حل هذه المهام دون الاعتماد على مكتبات C خارجية (مثل libpng أو libjpeg)، مما يبسط بناء المشروع ويجعله متعدد المنصات "خارج الصندوق".

تدعم المكتبة العشرات من التنسيقات (PNG, JPEG, GIF, BMP, TIFF, WebP, ICO وغيرها)، وتوفر الوصول إلى البكسلات الفردية، وتستطيع تغيير الحجم، والقص، والتدوير، وعكس الألوان، وتطبيق المرشحات. يعتمد جوهر المكتبة على trait GenericImageView، الذي يسمح بالعمل بشكل موحد مع أي نوع من الصور. بفضل تصميم Rust، تحصل على أقصى أداء دون المساس بالأمان.

التثبيت

لإضافة مكتبة image إلى مشروع Rust، يجب إضافتها إلى ملف Cargo.toml:

[dependencies]
image = "0.25"

بعد ذلك، قم بتنفيذ الأمر cargo build. سيقوم Cargo تلقائيًا بتحميل المكتبة وجميع تبعياتها. للعمل مع تنسيقات محددة (مثل WebP أو AVIF)، قد تحتاج إلى إضافة feature flags إضافية، ولكن للاستخدام الأساسي، يكفي التكوين القياسي.

بداية سريعة

مثال عملي بسيط: تحميل صورة، تغيير حجمها، وحفظها:

use image::{GenericImageView, imageops};

fn main() -> Result<(), image::ImageError> {
    // 1. تحميل الصورة من ملف
    let img = image::open("input.jpg")?;
    
    // 2. تغيير الحجم إلى 300x200 بكسل
    let resized = imageops::resize(&img, 300, 200, imageops::FilterType::Lanczos3);
    
    // 3. حفظ النتيجة بصيغة PNG
    resized.save("output.png")?;
    
    println!("تمت معالجة الصورة بنجاح!");
    Ok(())
}

يقوم هذا الكود بفتح ملف input.jpg، وتغيير حجمه إلى 300x200 بكسل باستخدام مرشح Lanczos3 (من أفضل المرشحات جودة)، وحفظ النتيجة كـ output.png. لاحظ معالجة الأخطاء عبر Result - هذا هو الأسلوب الأمثل في Rust.

الدوال والوظائف الأساسية

1. image::open

التوقيع: pub fn open<P: AsRef<Path>>(path: P) -> ImageResult<DynamicImage>

الوصف: تحميل صورة من ملف، مع التعرف التلقائي على التنسيق من الامتداد أو المحتوى. تُرجع DynamicImage - وهو enum يمكن أن يحتوي على صورة من أي نوع مدعوم (Rgb8, Rgba8, Gray8، إلخ).

مثال:

match image::open("photo.png") {
    Ok(img) => println!("تم تحميل الصورة، الأبعاد: {}x{}", img.width(), img.height()),
    Err(e) => eprintln!("خطأ في التحميل: {}", e),
}

2. DynamicImage::to_rgb8 و to_rgba8

التوقيع: pub fn to_rgb8(&self) -> ImageBuffer<Rgb<u8>, Vec<u8>>

الوصف: تحويل الصورة الديناميكية إلى نوع بكسل محدد. to_rgb8 - إلى RGB (3 قنوات)، to_rgba8 - إلى RGBA (4 قنوات).

توصيات