在Android中批量处理图片裁剪为相同大小可以通过使用Bitmap API来实现。我们可以创建一个工具类来进行批量图片处理。以下是一个完整的示例,包括如何读取存储中的图片文件,裁剪它们并保存回存储。

首先,确保你在AndroidManifest.xml中添加了必要的权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
package com.example.imagecropperimport android.Manifest
import android.app.Activity
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.os.Bundle
import android.os.Environment
import androidx.appcompat.app.AppCompatActivity
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import java.io.File
import java.io.FileOutputStreamclass MainActivity : AppCompatActivity() {private val REQUEST_CODE_PERMISSIONS = 1001private val REQUIRED_PERMISSIONS = arrayOf(Manifest.permission.READ_EXTERNAL_STORAGE,Manifest.permission.WRITE_EXTERNAL_STORAGE)override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)if (allPermissionsGranted()) {cropImages()} else {ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS)}}private fun allPermissionsGranted() = REQUIRED_PERMISSIONS.all {ContextCompat.checkSelfPermission(baseContext, it) == PackageManager.PERMISSION_GRANTED}override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray) {super.onRequestPermissionsResult(requestCode, permissions, grantResults)if (requestCode == REQUEST_CODE_PERMISSIONS) {if (grantResults.isNotEmpty() && grantResults.all { it == PackageManager.PERMISSION_GRANTED }) {cropImages()} else {// Permission denied, show a message to the user.}}}private fun cropImages() {val sourceDir = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Source")val destinationDir = File(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES), "Cropped")if (!destinationDir.exists()) {destinationDir.mkdirs()}sourceDir.listFiles()?.forEach { file ->if (file.isFile && isImageFile(file.name)) {val bitmap = BitmapFactory.decodeFile(file.absolutePath)val croppedBitmap = cropCenter(bitmap, 500, 500) // Crop to 500x500 pixelssaveBitmapToFile(croppedBitmap, destinationDir, file.name)}}}private fun isImageFile(fileName: String): Boolean {return fileName.endsWith(".jpg", ignoreCase = true) || fileName.endsWith(".jpeg", ignoreCase = true) ||fileName.endsWith(".png", ignoreCase = true) || fileName.endsWith(".bmp", ignoreCase = true) ||fileName.endsWith(".gif", ignoreCase = true)}private fun cropCenter(source: Bitmap?, newWidth: Int, newHeight: Int): Bitmap? {return source?.let {val x = (it.width - newWidth) / 2val y = (it.height - newHeight) / 2Bitmap.createBitmap(it, x, y, newWidth, newHeight)}}private fun saveBitmapToFile(bitmap: Bitmap, directory: File, fileName: String) {val file = File(directory, fileName)FileOutputStream(file).use { out ->bitmap.compress(Bitmap.CompressFormat.PNG, 90, out)}}
}
  1. 请求读取和写入外部存储的权限。
  2. 定义了一个方法cropImages()来遍历源目录中的所有图片文件,并将它们裁剪成指定的大小(这里是500x500像素)。
  3. 使用cropCenter()方法从原始位图中裁剪出居中的部分。
  4. 将裁剪后的位图保存到目标目录。

请确保在运行此代码之前,在设备上创建名为“Source”的文件夹并将要处理的图片放入其中。裁剪后的图片将会被保存到名为“Cropped”的文件夹中。