Compose IO

针对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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值