71 lines
2.5 KiB
Kotlin
71 lines
2.5 KiB
Kotlin
|
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()
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|