上面的异常是因为将图片插入到数据库导致的,怎么压缩该图片资源确保不会出现以上异常?用kotlin实现
时间: 2024-09-29 09:15:47 浏览: 49
安卓程序开发 课程学习 课程作业
当需要将大尺寸图片插入数据库时,确实有可能触发SQLite的BlobTooBigException。为了防止这种情况,可以先对图片资源进行压缩。在Kotlin中,我们可以使用`BitmapFactory`库来压缩Bitmap对象。以下是一个简单的示例:
```kotlin
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.content.ContentResolver
import java.io.ByteArrayOutputStream
fun compressImageToByteArray(imagePath: String): ByteArray {
// 加载原始图片
val bitmap = BitmapFactory.decodeFile(imagePath)
// 创建一个用于存储压缩后字节的ByteArrayOutputStream
val outputStream = ByteArrayOutputStream()
val compressedBitmap = if (bitmap.isMutable) {
// 如果是mutable,可以进一步压缩,提高压缩率
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outputStream)
} else {
// 如果不可变,复制原图再压缩
bitmap.copy(Bitmap.Config.ARGB_8888, true)
bitmap.compress(Bitmap.CompressFormat.JPEG, 80, outputStream)
}
return outputStream.toByteArray()
}
fun insertCompressedImageIntoDatabase(contentResolver: ContentResolver, byteArray: ByteArray, uri: Uri) {
try {
contentResolver.insert(uri, ContentValues().apply { put("image_data", byteArray) })
} catch (e: SQLiteBlobTooBigException) {
// 处理异常,例如记录日志或提示用户减小图片尺寸
println("Failed to insert image due to size: ${e.message}")
}
}
```
在这个例子中,我们首先加载图像,并使用`compress`方法将其压缩到指定的质量(这里是80%),然后将压缩后的字节数组插入数据库。如果压缩过程中抛出`SQLiteBlobTooBigException`,则捕获异常并进行相应的处理。
阅读全文