针对File Bitmap Uri String ByteArray 进行常用方法扩展
- 创建缓存模板图片文件
- 文件转Uri
- Uri转Bitmap
- Bitmap转File
- Bitmap转ByteArray
- Bitmap旋转角度
- Bitmap ByteArray 旋转
- ByteArray转Bitmap
- 旋转图片
- 图片文件纠正的角度
- 图片文件压缩格式
- Bitmap压缩为ByteArrayOutputStream
- 压缩图片到多少kb
- File转对应宽高的Bitmap
- 图片File压缩到一定极限值
- 文件后缀
- File 获取 Bitmap options
- ByteArray 获取 Bitmap options
- InputStream 获取 Bitmap options
- InputStream 转 Bitmap
- 图片File缩略图
- File是否是Bitmap
- File是否可压缩图片
- 多行Base64处理为单行
- 文件转Base64字符串
- Base64转File
- Bitmap转Base64String
- Base64转Bitmap
- 创建媒体图片文件Uri
- 创建媒体视频文件Uri
- 创建媒体音频文件Uri
- 通过后缀名称获取文件类型
- 删除媒体文件
- 级联删除文件夹
- 级联清空文件夹
- 计算文件或文件夹的总大小
- InputStream转File
- File转ByteArray
import android.annotation.SuppressLint
import android.content.ContentValues
import android.content.Context
import android.database.Cursor
import android.graphics.Bitmap
import android.graphics.Bitmap.CompressFormat
import android.graphics.BitmapFactory
import android.graphics.ImageDecoder
import android.graphics.Matrix
import android.graphics.Rect
import android.media.ExifInterface
import android.media.ThumbnailUtils
import android.net.Uri
import android.os.Build
import android.provider.MediaStore
import android.provider.OpenableColumns
import android.util.Base64
import androidx.core.content.FileProvider
import java.io.BufferedOutputStream
import java.io.ByteArrayOutputStream
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.io.InputStream
import java.io.UnsupportedEncodingException
import java.net.URLDecoder
import java.net.URLEncoder
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
import kotlin.math.min
/**
* 创建缓存模板图片文件
* @param context 上下文对象
* @return IMG_XXX.png
*/
fun createExternalCacheImageFile(context: Context): File {
return File.createTempFile("IMG_", ".jpg", context.externalCacheDir)
}
/**
* 文件转Uri
* @param context 上下文对象
* @return Uri
*/
fun File.toUri(context: Context): Uri {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
return FileProvider.getUriForFile(context, "${context.packageName}.fileprovider", this)
}
return Uri.fromFile(this)
}
/**
* Uri转File
* @param context 上下文
* @return file
*/
fun Uri.toFile(context: Context): File? {
val contentResolver = context.contentResolver
val cursor: Cursor? = contentResolver.query(this, null, null, null, null)
return cursor?.use {
if (it.moveToFirst()) {
val columnIndex = it.getColumnIndex(OpenableColumns.DISPLAY_NAME)
val displayName: String = it.getString(columnIndex)
val file = File(context.externalCacheDir, displayName)
val inputStream = contentResolver.openInputStream(this)
val outputStream = FileOutputStream(file)
inputStream?.use {
input ->
outputStream.use {
output ->
input.copyTo(output)
}
}
file
} else {
null
}
}
}
//***************************************[Bitmap]***************************************
/**
* Uri转Bitmap
* @param context 上下文对象
* @return Bitmap
*/
@SuppressLint("NewApi")
fun Uri.toBitmap(context: Context): Bitmap {
val source = ImageDecoder.createSource(context.contentResolver, this)
return ImageDecoder.decodeBitmap(source)
}
/**
* Bitmap转File
*/
fun Bitmap.toFile(context: Context): File {
val file = File.createTempFile("IMG_", ".jpg", context.externalCacheDir)
file.outputStream().use {
stream ->
compress(CompressFormat.PNG, 100, stream)
}
return file
}
/**
* Bitmap转File
* @param path 路径
*/
fun Bitmap.toFile(path: String): File {
val file = File(path)
file.outputStream().use {
stream ->
compress(CompressFormat.PNG, 100, stream)
}
return file
}
/**
* Bitmap转File
*
* @param context 上下文
* @param format 图片路径
* @param quality 图片质量[1-100]
* @return
*/
fun Bitmap.toFile(context: Context, format: CompressFormat, quality: Int): File {
val file = File.createTempFile("IMG_", ".jpg", context.externalCacheDir)
file.outputStream().use {
stream ->
compress(format, quality, stream)
}
return file
}
/**
* Bitmap旋转角度
* @param degrees 旋转角度
* @return 操作后的Bitmap
*/
fun Bitmap.rotate(degrees: Float): Bitmap {
val matrix = Matrix()
matrix.postRotate(degrees)
return Bitmap.createBitmap(this, 0, 0, width, height, matrix, true)
}
/**
* Bitmap ByteArray 旋转
* @param degrees 旋转角度
*/
fun ByteArray.rotate(degrees: Float): Bitmap {
val bitmap = BitmapFactory.decodeByteArray(this, 0, size)
val matrix = Matrix()
matrix.postRotate(degrees)
return Bitmap.createBitmap(bitmap, 0, 0, bitmap.width, bitmap.height, matrix, true)
}
/**
* 旋转图片
* @param degrees 旋转角度
* @param width 目标宽度
* @param height 目标高度
* @return
*/
fun File.rotate(degrees: Float, width: Int, height: Int): Bitmap {
val source = if (width > 0 && height > 0