在 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
在 Kotlin 的 Android 开发中,图像处理的基础是 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。支持加载、绘制和导出图像。
KMP 的 expect/actual 示例:
// commonMainexpect fun loadImageBytes(path: String): ByteArray
// androidMainactual fun load