diff app/src/main/java/com/bartsent/simpleresizer/EditImage.kt @ 6:e8059b166de1

Lanczos works, but is painfully slow.
author David Barts <n5jrn@me.com>
date Tue, 16 Feb 2021 17:29:52 -0800
parents 247e03baf77c
children 884092efe31a 5626557ac542
line wrap: on
line diff
--- a/app/src/main/java/com/bartsent/simpleresizer/EditImage.kt	Wed Feb 10 16:31:01 2021 -0800
+++ b/app/src/main/java/com/bartsent/simpleresizer/EditImage.kt	Tue Feb 16 17:29:52 2021 -0800
@@ -17,6 +17,7 @@
 import androidx.appcompat.app.AppCompatActivity
 import androidx.appcompat.widget.PopupMenu
 import com.bartsent.simpleresizer.databinding.ActivityEditImageBinding
+import com.bartsent.simpleresizer.lib.getScaledInstance
 import java.io.File
 import java.io.IOException
 import kotlin.math.roundToInt
@@ -135,17 +136,15 @@
 
     fun doScale(newMax: Int): Unit {
         val oldBitmap = State.bitmap!!
-        val factor = newMax.toFloat() / maxOf(oldBitmap.width, oldBitmap.height).toFloat()
+        val factor = newMax.toDouble() / maxOf(oldBitmap.width, oldBitmap.height).toDouble()
         if (factor >= 1.0) {
             throw IllegalArgumentException("can only scale down")
         }
         val newBitmap = Bitmap.createBitmap((oldBitmap.width * factor).roundToInt(), (oldBitmap.height * factor).roundToInt(), oldBitmap.config)
         copyColorSpace(oldBitmap, newBitmap)
-        val scaler = Matrix().apply { setScale(factor, factor) }
-        Canvas(newBitmap).run {
-            drawBitmap(oldBitmap, scaler, null)
-        }
-        setImage(newBitmap)
+        setImage(oldBitmap.getScaledInstance(
+                (oldBitmap.width.toDouble() * factor + 0.5).toInt(),
+                (oldBitmap.height.toDouble() * factor + 0.5).toInt()))
     }
 
     // is there any way to remember the last scale value?