العمل مع الصور في Kotlin: نظرة عامة على المكتبات وأمثلة عملية
Kotlin هي لغة حديثة متعددة المنصات تُستخدم بنشاط في التطوير لـ JVM (سطح المكتب)، Android، وكذلك في مشاريع الخلفية والمشاريع متعددة المنصات (KMP). العمل مع الصور هو إحدى المهام الشائعة، وفي نظام Kotlin البيئي هناك عدة طرق: من استخدام مكتبات Java القياسية إلى الحلول المتخصصة لـ Android و Kotlin Multiplatform. في هذه المقالة، سنستعرض المكتبات والأدوات الرئيسية، ونعرض أمثلة الكود، ونقدم توصيات عملية.
1. الأدوات المدمجة: AWT (Java Desktop / JVM)
لتطبيقات سطح المكتب على JVM (مثل JavaFX أو Swing)، من الأسهل استخدام الحزمة القياسية java.awt و javax.imageio. هذه المكتبات متاحة "مباشرة" وتسمح بتحميل الصور وتغيير حجمها وتحويل التنسيقات والرسم عليها.
مثال: تحميل وتغيير الحجم والحفظ
import java.awt.image.BufferedImageimport java.io.Fileimport javax.imageio.ImageIO
fun resizeImage(inputPath: String, outputPath: String, newWidth: Int, newHeight: Int) { val original: BufferedImage = ImageIO.read(File(inputPath)) val resized = BufferedImage(newWidth, newHeight, original.type) val g = resized.createGraphics() g.drawImage(original, 0, 0, newWidth, newHeight, null) g.dispose() ImageIO.write(resized, "jpg", File(outputPath)) println("تم حفظ الصورة: $outputPath")}
fun main() { resizeImage("input.jpg", "output.jpg", 800, 600)}للتدوير أو إضافة علامات مائية أو الاقتصاص، يمكن استخدام طرق Graphics2D والتحويلات الأفينية.
2. Android: Bitmap و BitmapFactory
في تطوير Android باستخدام Kotlin، أساس العمل مع الصور هو الفئة android.graphics.Bitmap والأدوات المساعدة BitmapFactory. تسمح بتحميل الصور من الموارد أو الملفات أو الشبكة، بالإضافة إلى إجراء معالجة أساسية.
مثال: التحميل من الموارد وتغيير الحجم (Android)
import android.graphics.Bitmapimport android.graphics.BitmapFactoryimport android.graphics.Matriximport java.io.ByteArrayOutputStream
fun scaleBitmap(bitmap: Bitmap, maxSize: Int): Bitmap { val width = bitmap.width val height = bitmap.height val scale = if (width > height) maxSize.toFloat() / width else maxSize.toFloat() / height val matrix = Matrix() matrix.postScale(scale, scale) return Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix, true)}
fun bitmapToByteArray(bitmap: Bitmap, quality: Int = 90): ByteArray { val stream = ByteArrayOutputStream() bitmap.compress(Bitmap.CompressFormat.JPEG, quality, stream) return stream.toByteArray()}لمعالجة أكثر تعقيدًا (مرشحات، تأثيرات)، يمكن استخدام android.renderscript (تم إهماله في API 31) أو مكتبة OpenCV Android.
3. Kotlin Multiplatform (KMP): مكتبة KVision أو حلول مخصصة
في المشاريع متعددة المنصات، لا يوجد معيار واحد للعمل مع الصور. غالبًا ما تُستخدم:
- KVision — إطار عمل لتطبيقات الويب على Kotlin/JS، وله دعم مدمج للعمل مع Canvas و ImageData.
- Okio + ImageIO (JVM) / Bitmap (Android) — بالنسبة لـ KMP، غالبًا ما يتم كتابة أغلفة
expect/actual، حيث يتم استخدام تطبيق خاص بكل منصة. - Skiko — مكتبة من JetBrains للعمل مع الرسومات (Skia)، متاحة على JVM و JS و Native. تسمح بتحميل الصور ورسمها وتصديرها.
مثال expect/actual لـ KMP:
// commonMainexpect fun loadImageBytes(path: String): ByteArray
// androidMainactual fun load