import
android.content.ContentValues
import
android.graphics.*
import
android.net.Uri
import
android.os.Build
import
androidx.appcompat.app.AppCompatActivity
import
android.os.Bundle
import
android.os.Environment
import
android.provider.MediaStore
import
android.widget.Button
import
android.widget.ImageView
import
android.widget.Toast
import
androidx.annotation.RequiresApi
import
java.io.File
import
java.io.FileOutputStream
import
java.io.OutputStream
import
java.lang.Integer.min
class
MainActivity : AppCompatActivity() {
private
lateinit var buttonCrop: Button
private
lateinit var buttonSave: Button
private
lateinit var imageView: ImageView
private
lateinit var bitmap: Bitmap
@RequiresApi
(Build.VERSION_CODES.N)
override fun onCreate(savedInstanceState: Bundle?) {
super
.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
imageView = findViewById(R.id.iv)
buttonCrop = findViewById(R.id.btnCrop)
buttonSave = findViewById(R.id.btnSave)
val bitmapResourceID: Int = R.drawable.image
imageView.setImageBitmap(BitmapFactory.decodeResource(resources, bitmapResourceID))
bitmap = BitmapFactory.decodeResource(resources, bitmapResourceID)
buttonCrop.setOnClickListener {
bitmap = getCircularBitmap(bitmap)
imageView.setImageBitmap(bitmap)
}
buttonSave.setOnClickListener {
saveMediaToStorage(bitmap)
}
}
@RequiresApi
(Build.VERSION_CODES.N)
private
fun getCircularBitmap(srcBitmap: Bitmap?): Bitmap {
val squareBitmapWidth = min(srcBitmap!!.width, srcBitmap.height)
val dstBitmap = Bitmap.createBitmap(
squareBitmapWidth,
squareBitmapWidth,
Bitmap.Config.ARGB_8888
)
val canvas = Canvas(dstBitmap)
val paint = Paint()
paint.isAntiAlias =
true
val rect = Rect(
0
,
0
, squareBitmapWidth, squareBitmapWidth)
val rectF = RectF(rect)
canvas.drawOval(rectF, paint)
paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC_IN)
val left = ((squareBitmapWidth - srcBitmap.width) /
2
).toFloat()
val top = ((squareBitmapWidth - srcBitmap.height) /
2
).toFloat()
canvas.drawBitmap(srcBitmap, left, top, paint)
srcBitmap.recycle()
return
dstBitmap
}
private
fun saveMediaToStorage(bitmap: Bitmap) {
val filename =
"${System.currentTimeMillis()}.jpg"
var fos: OutputStream? =
null
if
(Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
this
.contentResolver?.also { resolver ->
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, filename)
put(MediaStore.MediaColumns.MIME_TYPE,
"image/jpg"
)
put(MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES)
}
val imageUri: Uri? = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, contentValues)
fos = imageUri?.let { resolver.openOutputStream(it) }
}
}
else
{
val imagesDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES)
val image = File(imagesDir, filename)
fos = FileOutputStream(image)
}
fos?.use {
bitmap.compress(Bitmap.CompressFormat.JPEG,
100
, it)
Toast.makeText(
this
,
"Captured View and saved to Gallery"
, Toast.LENGTH_SHORT).show()
}
}
}