84 lines
2.1 KiB
Kotlin
84 lines
2.1 KiB
Kotlin
package com.sw.dualscreen.ext
|
|
|
|
import android.content.res.Resources
|
|
import android.graphics.Bitmap
|
|
import android.graphics.BitmapFactory
|
|
import android.graphics.ImageFormat
|
|
import android.graphics.Rect
|
|
import android.graphics.YuvImage
|
|
import android.util.TypedValue
|
|
import androidx.annotation.Dimension
|
|
import androidx.camera.core.ImageProxy
|
|
import java.io.ByteArrayOutputStream
|
|
|
|
/**
|
|
* 将 Int 值转换为 dp 值
|
|
*/
|
|
val Int.dp: Int
|
|
@Dimension(unit = Dimension.DP)
|
|
get() = TypedValue.applyDimension(
|
|
TypedValue.COMPLEX_UNIT_DIP,
|
|
this.toFloat(),
|
|
Resources.getSystem().displayMetrics
|
|
).toInt()
|
|
|
|
/**
|
|
* 将 Float 值转换为 dp 值
|
|
*/
|
|
val Float.dp: Float
|
|
@Dimension(unit = Dimension.DP)
|
|
get() = TypedValue.applyDimension(
|
|
TypedValue.COMPLEX_UNIT_DIP,
|
|
this,
|
|
Resources.getSystem().displayMetrics
|
|
)
|
|
|
|
/**
|
|
* 将 Int 值转换为 sp 值
|
|
*/
|
|
val Int.sp: Float
|
|
@Dimension(unit = Dimension.SP)
|
|
get() = TypedValue.applyDimension(
|
|
TypedValue.COMPLEX_UNIT_SP,
|
|
this.toFloat(),
|
|
Resources.getSystem().displayMetrics
|
|
)
|
|
|
|
/**
|
|
* 将 Float 值转换为 sp 值
|
|
*/
|
|
val Float.sp: Float
|
|
@Dimension(unit = Dimension.SP)
|
|
get() = TypedValue.applyDimension(
|
|
TypedValue.COMPLEX_UNIT_SP,
|
|
this,
|
|
Resources.getSystem().displayMetrics
|
|
)
|
|
|
|
fun Double.format2String(): String = "%.1f".format(this)
|
|
|
|
// 添加扩展函数
|
|
fun ImageProxy.toSafeBitmap(): Bitmap {
|
|
val yBuffer = planes[0].buffer // Y
|
|
val uBuffer = planes[1].buffer // U
|
|
val vBuffer = planes[2].buffer // V
|
|
|
|
val ySize = yBuffer.remaining()
|
|
val uSize = uBuffer.remaining()
|
|
val vSize = vBuffer.remaining()
|
|
|
|
val nv21 = ByteArray(ySize + uSize + vSize)
|
|
|
|
// Y
|
|
yBuffer.get(nv21, 0, ySize)
|
|
|
|
// U/V
|
|
vBuffer.get(nv21, ySize, vSize)
|
|
uBuffer.get(nv21, ySize + vSize, uSize)
|
|
|
|
val yuvImage = YuvImage(nv21, ImageFormat.NV21, this.width, this.height, null)
|
|
val out = ByteArrayOutputStream()
|
|
yuvImage.compressToJpeg(Rect(0, 0, this.width, this.height), 100, out)
|
|
val imageBytes = out.toByteArray()
|
|
return BitmapFactory.decodeByteArray(imageBytes, 0, imageBytes.size)
|
|
} |