package jp.juggler.subwaytooter import android.graphics.Bitmap import android.graphics.BitmapFactory import androidx.test.ext.junit.runners.AndroidJUnit4 import jp.juggler.util.data.* import org.junit.Assert.fail import org.junit.Test import org.junit.runner.RunWith import java.io.ByteArrayOutputStream @RunWith(AndroidJUnit4::class) class TestBitmapSample { /** * BitmapFactory.Options.inSampleSize の取り扱いの確認 */ @Test fun test() { val srcSize = 1024 val baSrc = run { val bitmap = Bitmap.createBitmap(srcSize, srcSize, Bitmap.Config.ARGB_8888) try { ByteArrayOutputStream().use { outStream -> bitmap.compress(Bitmap.CompressFormat.JPEG, 70, outStream) outStream.toByteArray() } } finally { bitmap.recycle() } } for (n in 0..32) { val options = BitmapFactory.Options().apply { inScaled = false outWidth = 0 outHeight = 0 inJustDecodeBounds = false inSampleSize = n } val expectedSizeA: Int val expectedSizeB: Int when (n) { // ドキュメントには "If set to a value > 1" とあり、1以下の値はリサイズに影響しない 0, 1 -> { expectedSizeA = srcSize expectedSizeB = srcSize } // 2以上の場合、ドキュメントには // "Note: the decoder uses a final value based on powers of 2, any other value will be rounded down to the nearest power of 2." // とあるが、実際に試すと端末により width = srcSize/n となることがある。 else -> { expectedSizeA = srcSize.div(n.takeHighestOneBit()) expectedSizeB = srcSize.div(n) } } val bitmap = BitmapFactory.decodeByteArray(baSrc, 0, baSrc.size, options)!! try { when (bitmap.width) { expectedSizeA -> Unit expectedSizeB -> Unit else -> fail("inSampleSize=$n, srcSize=$srcSize, resultWidth=${bitmap.width}") } } finally { bitmap.recycle() } } } }