Kotlin 中的图像处理:使用 Kamel 库进行 resize 和 crop
在现代 Android 和 Kotlin 多平台项目开发中,经常需要以编程方式调整图像大小 (resize) 和裁剪图像 (crop)。这对于优化加载、创建缩略图、适配不同屏幕或准备上传到服务器的图像至关重要。在本文中,我们将介绍 Kamel 库——一个用纯 Kotlin 编写、支持多平台的强大图像处理工具。
什么是 Kamel?
Kamel (Kotlin Asynchronous Media Loading) 是一个专为 Kotlin Multiplatform 设计的图像加载、缓存和处理库。它提供了简单的 API 来执行诸如 resize 和 crop 之类的操作,而无需引入像 Glide 或 Picasso 这样重量级的框架。Kamel 支持 Android、iOS、JVM 和 JavaScript,使其成为跨平台项目的理想选择。
通过 Gradle 安装该库:
// build.gradle.kts (commonMain)implementation("media.kamel:kamel-image:1.0.0")调整图像大小 (resize)
resize 操作允许将图像的原始尺寸更改为指定的宽度和高度。在 Kamel 中,这是通过 resize() 函数实现的,该函数接受目标尺寸和缩放模式 (scale mode)。
基本调整大小的示例:
import androidx.compose.runtime.*import media.kamel.image.loadImageimport media.kamel.image.resizer.*
@Composablefun ResizedImage() { val image = loadImage( data = "https://example.com/photo.jpg", resizer = Resizer( width = 300, height = 200, scaleMode = ScaleMode.Fit ) ) // 在 Image composable 中显示 image}在此示例中,图像将缩放至 300x200 像素,并保持宽高比 (ScaleMode.Fit)。如果需要拉伸图像而不保持宽高比,请使用 ScaleMode.Fill 或 ScaleMode.Crop(后者会自动裁剪边缘)。
裁剪图像 (crop)
Crop 允许从原始图像中裁剪出一个矩形区域。在 Kamel 中,可以通过两种方式执行裁剪:
- 通过 ScaleMode.Crop — 缩放时自动裁剪;
- 通过手动指定区域 — 使用
ImageRegion类。
手动裁剪的示例:
import media.kamel.image.loadImageimport media.kamel.image.cropper.*
@Composablefun CroppedImage() { val image = loadImage( data = "https://example.com/photo.jpg", cropper = Cropper( region = ImageRegion( left = 50, top = 50, width = 200, height = 150 ) ) ) // 显示裁剪后的图像}这里从图像中裁剪出一个区域,该区域从坐标 (50, 50) 开始,尺寸为 200x150 像素。当需要提取特定部分(例如照片中的人脸)时,这非常有用。
组合使用 resize 和 crop
通常需要按顺序执行这两个操作:先裁剪,再调整大小。Kamel 允许通过链式调用来组合它们:
@Composablefun CombinedProcessing() { val image = loadImage( data = "https://example.com/photo.jpg", resizer = Resizer(width = 400, height = 300, scaleMode = ScaleMode.Fit), cropper = Cropper(region = ImageRegion(100, 100, 600, 450)) )}执行顺序:首先应用