对jpeg映像进行删除,并将其在kotlin(至少80%)中恢复为原始图像 已经使用Kotlin创建了一个应用程序,该应用程序将要求用户从图库中选择图像。然后,用户具有两个按钮压缩图像和解压缩图像。 现在的问题是,当我们是

问题描述 投票:0回答:1
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
kotlin amazon-s3 compression bitmapfactory
1个回答
0
投票
参考: -

does bitmapfactory.decodefile()文件解码时jpeg映像解压缩?

	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.