comparison app/src/main/java/com/bartsent/simpleresizer/EditImage.kt @ 10:5626557ac542 memo

Add progress bar and a worker thread. Still way slow.
author David Barts <n5jrn@me.com>
date Wed, 17 Feb 2021 13:39:50 -0800
parents e8059b166de1
children 678adef4774f
comparison
equal deleted inserted replaced
8:6ae738b8a814 10:5626557ac542
11 import android.provider.MediaStore 11 import android.provider.MediaStore
12 import android.provider.OpenableColumns 12 import android.provider.OpenableColumns
13 import android.view.MenuItem 13 import android.view.MenuItem
14 import android.view.View 14 import android.view.View
15 import android.widget.EditText 15 import android.widget.EditText
16 import android.widget.ProgressBar
16 import androidx.appcompat.app.AlertDialog 17 import androidx.appcompat.app.AlertDialog
17 import androidx.appcompat.app.AppCompatActivity 18 import androidx.appcompat.app.AppCompatActivity
18 import androidx.appcompat.widget.PopupMenu 19 import androidx.appcompat.widget.PopupMenu
19 import com.bartsent.simpleresizer.databinding.ActivityEditImageBinding 20 import com.bartsent.simpleresizer.databinding.ActivityEditImageBinding
20 import com.bartsent.simpleresizer.lib.getScaledInstance 21 import com.bartsent.simpleresizer.lib.getScaledInstance
21 import java.io.File 22 import java.io.File
22 import java.io.IOException 23 import java.io.IOException
24 import kotlin.concurrent.thread
23 import kotlin.math.roundToInt 25 import kotlin.math.roundToInt
24 26
25 class EditImage : AppCompatActivity() { 27 class EditImage : AppCompatActivity() {
26 private object State { 28 private object State {
27 var uri: Uri? = null 29 var uri: Uri? = null
140 if (factor >= 1.0) { 142 if (factor >= 1.0) {
141 throw IllegalArgumentException("can only scale down") 143 throw IllegalArgumentException("can only scale down")
142 } 144 }
143 val newBitmap = Bitmap.createBitmap((oldBitmap.width * factor).roundToInt(), (oldBitmap.height * factor).roundToInt(), oldBitmap.config) 145 val newBitmap = Bitmap.createBitmap((oldBitmap.width * factor).roundToInt(), (oldBitmap.height * factor).roundToInt(), oldBitmap.config)
144 copyColorSpace(oldBitmap, newBitmap) 146 copyColorSpace(oldBitmap, newBitmap)
145 setImage(oldBitmap.getScaledInstance( 147 binding.progressBar.visibility = ProgressBar.VISIBLE
146 (oldBitmap.width.toDouble() * factor + 0.5).toInt(), 148 thread {
147 (oldBitmap.height.toDouble() * factor + 0.5).toInt())) 149 val newBitmap = oldBitmap.getScaledInstance(
150 (oldBitmap.width.toDouble() * factor + 0.5).toInt(),
151 (oldBitmap.height.toDouble() * factor + 0.5).toInt())
152 runOnUiThread {
153 binding.progressBar.visibility = ProgressBar.INVISIBLE
154 setImage(newBitmap)
155 }
156 }
148 } 157 }
149 158
150 // is there any way to remember the last scale value? 159 // is there any way to remember the last scale value?
151 // if so: should we? 160 // if so: should we?
152 161
213 copyColorSpace(oldBitmap, newBitmap) 222 copyColorSpace(oldBitmap, newBitmap)
214 val rotater = Matrix().apply { 223 val rotater = Matrix().apply {
215 setRotate(deg.toFloat(), oldBitmap.width.toFloat()/2.0f, oldBitmap.height.toFloat()/2.0f) 224 setRotate(deg.toFloat(), oldBitmap.width.toFloat()/2.0f, oldBitmap.height.toFloat()/2.0f)
216 postTranslate((w - oldBitmap.width).toFloat()/2.0f, (h - oldBitmap.height).toFloat()/2.0f) 225 postTranslate((w - oldBitmap.width).toFloat()/2.0f, (h - oldBitmap.height).toFloat()/2.0f)
217 } 226 }
218 Canvas(newBitmap).run { 227 binding.progressBar.visibility = ProgressBar.VISIBLE
219 drawBitmap(oldBitmap, rotater, null) 228 thread {
220 } 229 Canvas(newBitmap).run {
221 setImage(newBitmap) 230 drawBitmap(oldBitmap, rotater, null)
231 }
232 runOnUiThread {
233 binding.progressBar.visibility = ProgressBar.INVISIBLE
234 setImage(newBitmap)
235 }
236 }
222 } 237 }
223 238
224 fun cancelClicked(view: View): Unit { 239 fun cancelClicked(view: View): Unit {
225 State.uri = null 240 State.uri = null
226 State.bitmap = null 241 State.bitmap = null