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) }