在 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")}格式转换
简单的