Kotlin 图像处理:调整大小和裁剪 (resize & crop)
在现代 Kotlin 网页开发和移动应用创建中,经常需要以编程方式处理图像:为优化加载而缩小尺寸、裁剪多余边缘或准备预览图。在本文中,我们将介绍一个强大的图形处理工具——ImageMagick 库(通过 Java 封装 JMagick),它非常适合在 Kotlin 中执行 resize 和 crop 任务。
什么是 ImageMagick 和 JMagick?
ImageMagick 是一个跨平台的开源软件,用于创建、编辑和转换光栅图像。它支持超过 200 种格式(JPEG、PNG、GIF、WebP、TIFF 等)。为了在 Java/Kotlin 中使用 ImageMagick,我们使用 JMagick 库,它提供了 ImageMagick 函数的 Java Native Interface (JNI)。
在 Kotlin 中使用 ImageMagick 的优势:
- 高性能(原生 C/C++ 代码)
- 功能丰富:resize、crop、rotate、滤镜、格式转换
- 支持大图像的流式处理
- 压缩时精确控制质量
安装与配置
要使用 JMagick,您需要在系统上安装原生的 ImageMagick。然后在 build.gradle.kts 中添加依赖(针对 Gradle):
dependencies { implementation("org.im4java:im4java:1.4.0") // 替代封装 // 或者使用 JMagick: implementation("org.jmagick:jmagick:6.6.9")}注意:JMagick 需要安装 ImageMagick 6.x 版本(而非 7)。为简单起见,在示例中我们将使用 im4java——一个更现代、无需 JNI 的封装。
调整图像大小 (Resize)
resize 操作可以改变图像的尺寸,同时保持(或不保持)宽高比。在 im4java 中,这通过 ConvertCmd 类实现。
示例:将图像缩小到宽度 300 像素,保持宽高比:
import org.im4java.core.ConvertCmdimport org.im4java.core.IMOperation
fun resizeImage(inputPath: String, outputPath: String, targetWidth: Int) { val cmd = ConvertCmd() val op = IMOperation()
op.addImage(inputPath) op.resize(targetWidth, null) // null = 根据比例自动计算高度 op.addImage(outputPath)
cmd.run(op)}
fun main() { resizeImage("input.jpg", "output_resized.jpg", 300) println("图像已缩小到宽度 300px")}resize 参数:
resize(width, height)— 如果某个参数为 null,则保持宽高比resize(width, height, "^")— 最小填充区域resize(width, height, "!")— 强制调整,不保持宽高比
裁剪图像 (Crop)
Crop 从图像中裁剪出一个矩形区域。需要指定左上角的坐标以及区域的尺寸。
示例:裁剪一个大小为 200x200 像素的中心正方形:
import org.im4java.core.ConvertCmdimport org.im4java.core.IMOperation
fun cropImage(inputPath: String, outputPath: String, x: Int, y: Int, width: Int, height: Int) { val cmd = ConvertCmd() val op = IMOperation()
op.addImage(inputPath) op.crop(width, height, x, y) op.addImage(outputPath)
cmd.run(op)}
fun main() { // 裁剪区域:左上角 (100,50),尺寸 400x300 cropImage("input.jpg", "output_cropped.jpg", 100, 50, 400, 300) println("图像已裁剪")}要实现自动居中,可以计算坐标:
图书馆中也有
推荐