import android.content.Intent
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import android.net.Uri
import android.os.Bundle
import android.provider.MediaStore
import android.widget.Button
import android.widget.ImageView
import android.widget.Toast
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import java.io.ByteArrayOutputStream
import java.io.IOException
class MainActivity : AppCompatActivity() {
private lateinit var displayImage: ImageView //image selected
private lateinit var compressedImageView: ImageView //image after compression or decompression
private lateinit var selectImage: Button // button for selecting image from gallery
private lateinit var compressButton: Button // button to start compression
private lateinit var decompressButton: Button // Button to start decompression
private var imageUri: Uri? = null
private var compressedImageBytes: ByteArray? = null
private var decompressedImageBytes: ByteArray? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
displayImage = findViewById(R.id.imageView)
compressedImageView = findViewById(R.id.imageView2)
selectImage = findViewById(R.id.upload)
compressButton = findViewById(R.id.uploadWithCompress)
decompressButton = findViewById(R.id.decompressImage)
selectImage.setOnClickListener {
val intent = Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI)
pickImageLauncher.launch(intent)
}
compressButton.setOnClickListener {
imageUri?.let { compressImage(it) }
}
decompressButton.setOnClickListener {
compressedImageBytes?.let { decompressImage(it) }
}
}
private val pickImageLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result ->
if (result.resultCode == RESULT_OK) {
result.data?.data?.let {
imageUri = it
displayImage.setImageURI(it)
}
}
}
private fun compressImage(uri: Uri) {
try {
val bmp = MediaStore.Images.Media.getBitmap(contentResolver, uri)
val baos = ByteArrayOutputStream()
bmp.compress(Bitmap.CompressFormat.JPEG, 25, baos)
compressedImageBytes = baos.toByteArray()
val compressedBitmap = BitmapFactory.decodeByteArray(compressedImageBytes, 0, compressedImageBytes!!.size)
compressedImageView.setImageBitmap(compressedBitmap)
val compressedSizeKB = compressedImageBytes!!.size / 1024
Toast.makeText(this, "Compressed Image Size: $compressedSizeKB KB", Toast.LENGTH_SHORT).show()
} catch (e: IOException) {
e.printStackTrace()
}
}
private fun decompressImage(compressedBytes: ByteArray) {
val decompressedBitmap = BitmapFactory.decodeByteArray(compressedBytes, 0, compressedBytes.size)
compressedImageView.setImageBitmap(decompressedBitmap)
val decompressedSizeKB = compressedImageBytes!!.size / 1024
Toast.makeText(this, "Image Decompressed to Original Quality and its size is: $decompressedSizeKB KB", Toast.LENGTH_SHORT).show()
}
}
现在,现在几乎不可能将压缩图像的原始质量重新恢复到其原始形式,但是如果可以使用任何外部工具,请在此处共享。
图像压缩技术有两种类型的损失和无损。有损技术将永久删除图像的细节,并且无法逆转,这意味着解剖图像将与原始图像相同。而无损会压缩图像而不会影响图像的质量,从而使原始图像在减压后完全还原。
jpeg
Bitmap.CompressFormat.JPEG
始终是一种有损的压缩,这意味着一些细节被丢弃。如果您想压缩图像并以相同的形式检索而没有任何质量损失,请尝试使用PNG
Bitmap.CompressFormat.PNG
或WebP无损
Bitmap.CompressFormat.WEBP_LOSSLESS
does bitmapfactory.decodefile()文件解码时jpeg映像解压缩?