العمل مع الصور في Kotlin: نظرة عامة على المكتبات وأمثلة عملية
Kotlin هي لغة برمجة حديثة تعمل فوق JVM. بفضل التوافق الكامل مع Java، يمكن استخدام جميع مكتبات Java القياسية لمعالجة الصور، مثل javax.imageio و java.awt و javax.swing. في هذه المقالة، سنستعرض الطرق الأساسية للعمل مع الصور بلغة Kotlin: القراءة، الكتابة، تغيير الحجم، تطبيق الفلاتر، وتحويل التنسيقات.
المكتبات المطلوبة
للعمل مع الصور في Kotlin (JVM)، لا يلزم تثبيت تبعيات إضافية - فمكتبة JDK القياسية كافية. ومع ذلك، قد تكون هناك حاجة لمكتبات خارجية للمهام الأكثر تعقيدًا (مثل معالجة الصور الكبيرة أو العمل مع البيانات الوصفية):
- java.awt.image.BufferedImage - الفئة الأساسية لتمثيل الصورة في الذاكرة.
- javax.imageio.ImageIO - قراءة وكتابة الصور بتنسيقات مختلفة (PNG، JPEG، BMP، GIF).
- java.awt.Graphics2D - الرسم والتحويلات.
- Thumbnailator (اختياري) - يبسط تغيير الحجم وإنشاء الصور المصغرة.
- BoofCV (اختياري) - مكتبة رؤية حاسوبية تدعم Kotlin.
قراءة وكتابة الصور
أسهل طريقة لتحميل صورة هي استخدام ImageIO.read().
import java.awt.image.BufferedImageimport java.io.Fileimport javax.imageio.ImageIO
fun main() { // قراءة الصورة val inputFile = File("input.jpg") val image: BufferedImage = ImageIO.read(inputFile) ?: throw Exception("فشل تحميل الصورة")
// الكتابة بتنسيق آخر val outputFile = File("output.png") ImageIO.write(image, "png", outputFile)
println("تم حفظ الصورة: ${outputFile.absolutePath}")}تغيير حجم الصورة
لتغيير الحجم، نستخدم Graphics2D مع إعدادات التنعيم.
import java.awt.Graphics2Dimport java.awt.RenderingHintsimport java.awt.image.BufferedImageimport javax.imageio.ImageIOimport java.io.File
fun resizeImage(inputPath: String, outputPath: String, targetWidth: Int, targetHeight: Int) { val original: BufferedImage = ImageIO.read(File(inputPath)) val resized = BufferedImage(targetWidth, targetHeight, BufferedImage.TYPE_INT_RGB) val g2d: Graphics2D = resized.createGraphics()
// تفعيل التنعيم للحصول على تحجيم عالي الجودة g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR) g2d.drawImage(original, 0, 0, targetWidth, targetHeight, null) g2d.dispose()
ImageIO.write(resized, "jpg", File(outputPath)) println("تم تغيير حجم الصورة: $outputPath")}
fun main() { resizeImage("input.jpg", "resized.jpg", 800, 600)}تطبيق الفلاتر (التمويه، التباين)
للتأثيرات البسيطة، يمكن استخدام BufferedImageOp (مثل ConvolveOp للتمويه).
import java.awt.image.BufferedImageimport java.awt.image.ConvolveOpimport java.awt.image.Kernelimport javax.imageio.ImageIOimport java.io.File
fun applyBlur(inputPath: String, outputPath: String) { val image: BufferedImage = ImageIO.read(File(inputPath))
// نواة تمويه 5x5 val size = 5 val weight = 1.0f / (size * size) val kernelData = FloatArray(size * size) { weight } val kernel = Kernel(size, size, kernelData) val blurOp = ConvolveOp(kernel)
val blurred = blurOp.filter(image, null) ImageIO.write(blurred, "jpg", File(outputPath))}
fun main() { applyBlur("input.jpg", "blurred.jpg")}تحويل التنسيقات
تحويل بسيط