معالجة الصور في Kotlin: تغيير الحجم والقص باستخدام مكتبة ImageMagick

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

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

ابدأ الدورة

العمل مع الصور في Kotlin: تغيير الحجم والقص (resize & crop)



في تطوير الويب الحديث وتطبيقات الهاتف المحمول باستخدام Kotlin، غالبًا ما تنشأ الحاجة إلى معالجة الصور برمجيًا: تقليل الحجم لتحسين سرعة التحميل، قص الحواف الزائدة، أو إعداد صور مصغرة. في هذه المقالة، سنستعرض أداة قوية للعمل مع الرسوميات — مكتبة ImageMagick (عبر الغلاف Java JMagick)، وهي مثالية لمهام تغيير الحجم والقص في Kotlin.



ما هو ImageMagick و JMagick؟

ImageMagick هو برنامج مفتوح المصدر متعدد المنصات لإنشاء وتحرير وتحويل الصور النقطية. يدعم أكثر من 200 تنسيق (JPEG, PNG, GIF, WebP, TIFF وغيرها). للعمل مع ImageMagick من Java/Kotlin، تُستخدم مكتبة JMagick التي توفر واجهة Java الأصلية (JNI) لوظائف ImageMagick.



مزايا استخدام ImageMagick في Kotlin:

  • أداء عالٍ (كود أصلي بلغة C/C++)
  • وظائف غنية: تغيير الحجم، القص، التدوير، الفلاتر، تحويل التنسيقات
  • دعم المعالجة التدفقية للصور الكبيرة
  • تحكم دقيق في الجودة عند الضغط


التثبيت والإعداد

للعمل مع JMagick، يجب تثبيت ImageMagick الأصلي على نظامك. ثم أضف التبعية في ملف build.gradle.kts (لـ Gradle):



dependencies {    implementation("org.im4java:im4java:1.4.0") // غلاف بديل    // أو استخدم JMagick:    implementation("org.jmagick:jmagick:6.6.9")}


ملاحظة: يتطلب JMagick تثبيت ImageMagick الإصدار 6.x (وليس 7). للتبسيط، سنستخدم في الأمثلة im4java — وهو غلاف أكثر حداثة لا يتطلب JNI.



تغيير حجم الصورة (Resize)

عملية تغيير الحجم تغير أبعاد الصورة مع الحفاظ على النسب (أو بدونها). في im4java، يتم ذلك عبر الفئة ConvertCmd.



مثال: تصغير الصورة إلى عرض 300 بكسل مع الحفاظ على النسب:



import org.im4java.core.ConvertCmdimport org.im4java.core.IMOperation

fun resizeImage(inputPath: String, outputPath: String, targetWidth: Int) { val cmd = ConvertCmd() val op = IMOperation()

op.addImage(inputPath) op.resize(targetWidth, null) // null = ارتفاع تلقائي حسب النسبة op.addImage(outputPath)

cmd.run(op)}

fun main() { resizeImage("input.jpg", "output_resized.jpg", 300) println("تم تصغير الصورة إلى عرض 300 بكسل")}


معاملات تغيير الحجم:

  • resize(width, height) — إذا كان أحد المعاملات null، يتم الحفاظ على النسب
  • resize(width, height, "^") — الحد الأدنى لملء المنطقة
  • resize(width, height, "!") — تغيير إجباري بدون الحفاظ على النسب


قص الصورة (Crop)

القص يقطع منطقة مستطيلة من الصورة. يتم تحديد إحداثيات الزاوية العلوية اليسرى وأبعاد المنطقة.



مثال: قص مربع مركزي بحجم 200x200 بكسل:



import org.im4java.core.ConvertCmdimport org.im4java.core.IMOperation

fun cropImage(inputPath: String, outputPath: String, x: Int, y: Int, width: Int, height: Int) { val cmd = ConvertCmd() val op = IMOperation()

op.addImage(inputPath) op.crop(width, height, x, y) op.addImage(outputPath)

cmd.run(op)}

fun main() { // قص المنطقة: الزاوية العلوية اليسرى (100,50)، الأبعاد 400x300 cropImage("input.jpg", "output_cropped.jpg", 100, 50, 400, 300) println("تم قص الصورة")}


للتوسيط التلقائي، يمكن حساب الإحداثيات:



                
    
    

توصيات