在 Kotlin 中处理图像:库与代码示例

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

在 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

推荐