Kotlin 图像处理:使用 ImageMagick 库进行 resize 和 crop

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

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

开始课程

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("图像已裁剪")}


要实现自动居中,可以计算坐标:



                
    
    

推荐