11package com.awxkee.jxlcoder
22
3- import android.content.Intent
43import android.graphics.Bitmap
54import android.graphics.BitmapFactory
6- import android.graphics.ColorSpace
75import android.graphics.Matrix
8- import android.graphics.drawable.BitmapDrawable
96import android.graphics.drawable.Drawable
10- import android.hardware.DataSpace
117import android.os.Build
128import android.os.Bundle
139import android.util.Log
10+ import android.view.Display
1411import androidx.activity.ComponentActivity
1512import androidx.activity.compose.setContent
1613import androidx.compose.foundation.Image
17- import androidx.compose.foundation.background
1814import androidx.compose.foundation.layout.fillMaxSize
1915import androidx.compose.foundation.layout.fillMaxWidth
2016import androidx.compose.foundation.lazy.LazyColumn
21- import androidx.compose.foundation.lazy.LazyRow
2217import androidx.compose.material3.MaterialTheme
2318import androidx.compose.material3.Surface
2419import androidx.compose.material3.Text
@@ -27,48 +22,28 @@ import androidx.compose.runtime.LaunchedEffect
2722import androidx.compose.runtime.mutableStateListOf
2823import androidx.compose.runtime.remember
2924import androidx.compose.ui.Modifier
30- import androidx.compose.ui.graphics.Color
3125import androidx.compose.ui.graphics.asImageBitmap
3226import androidx.compose.ui.layout.ContentScale
3327import androidx.compose.ui.tooling.preview.Preview
3428import androidx.core.graphics.scale
3529import androidx.lifecycle.lifecycleScope
36- import com.awxkee.jxlcoder.animation.AnimatedDrawable
37- import com.awxkee.jxlcoder.animation.JxlAnimatedStore
3830import com.awxkee.jxlcoder.ui.theme.JXLCoderTheme
3931import com.bumptech.glide.integration.compose.ExperimentalGlideComposeApi
40- import com.google.accompanist.drawablepainter.rememberDrawablePainter
4132import kotlinx.coroutines.Dispatchers
33+ import kotlinx.coroutines.delay
4234import kotlinx.coroutines.launch
4335import okio.buffer
44- import okio.sink
4536import okio.source
46- import okio.use
47- import java.io.ByteArrayInputStream
48- import java.io.File
4937import java.io.FileNotFoundException
50- import java.io.FileOutputStream
51- import java.security.MessageDigest
5238import java.util.UUID
5339import kotlin.system.measureTimeMillis
5440
41+
5542class MainActivity : ComponentActivity () {
5643 @OptIn(ExperimentalGlideComposeApi ::class )
5744 override fun onCreate (savedInstanceState : Bundle ? ) {
5845 super .onCreate(savedInstanceState)
5946
60- // val buffer1 = this.assets.open("hdr_cosmos.jxl").source().buffer().readByteArray()
61- // assert(JxlCoder.isJXL(buffer1))
62- // assert(JxlCoder().getSize(buffer1) != null)
63- // val iccCosmosImage = JxlCoder().decode(buffer1)
64- // val buffer2 = this.assets.open("second_jxl.jxl").source().buffer().readByteArray()
65- // assert(JxlCoder.isJXL(buffer2))
66- // assert(JxlCoder().getSize(buffer2) != null)
67- // val buffer3 = this.assets.open("alpha_jxl.jxl").source().buffer().readByteArray()
68- // assert(JxlCoder.isJXL(buffer3))
69- // assert(JxlCoder().getSize(buffer3) != null)
70-
71-
7247 if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .O ) {
7348// val buffer4 = this.assets.open("happy_india.jxl").source().buffer().readByteArray()
7449// assert(JxlCoder.isJXL(buffer4))
@@ -204,11 +179,19 @@ class MainActivity : ComponentActivity() {
204179// imagesArray.add(decoded)
205180// }
206181
182+ val display: Display = this @MainActivity.windowManager.defaultDisplay
183+ if (Build .VERSION .SDK_INT >= Build .VERSION_CODES .N ) {
184+ val hdrCapabilities = display.hdrCapabilities
185+ val maxNits = hdrCapabilities.desiredMaxLuminance
186+ val whitePoint = hdrCapabilities.desiredMaxAverageLuminance
187+ Log .d(" Max HDR value" , " $maxNits whitePoint $whitePoint " )
188+ }
189+
207190 var assets =
208191 (this @MainActivity.assets.list(" " ) ? : return @launch).toList()
209192// assets = assets.filter { it.contains("20181110_213419__MMC1561-HDR.jxl") }
210193// assets = assets.take(15)
211- assets = assets.filter { it.contains(" cow_image_jxl .jxl" ) }
194+ assets = assets.filter { it.contains(" Lake_HDR .jxl" ) }
212195 for (asset in assets) {
213196 try {
214197 val buffer4 =
@@ -218,63 +201,68 @@ class MainActivity : ComponentActivity() {
218201 val largeImageSize = JxlCoder .getSize(buffer4)
219202 if (largeImageSize != null ) {
220203 val decodingTime = measureTimeMillis {
221- val srcImage = JxlCoder .decode(
222- buffer4,
223- preferredColorConfig = PreferredColorConfig .HARDWARE ,
224- com.awxkee.jxlcoder.ScaleMode .FIT ,
225- toneMapper = JxlToneMapper .REC2408 ,
226- )
227- }
228- Log .d(" JXLMain" , " Decoding time ${decodingTime} ms" )
229- val time = measureTimeMillis {
230- // val srcImage = JxlCoder.decodeSampled(
204+ // val srcImage = JxlCoder.decode(
231205// buffer4,
232- // largeImageSize.width / 2,
233- // largeImageSize.height / 2,
234206// preferredColorConfig = PreferredColorConfig.HARDWARE,
235207// com.awxkee.jxlcoder.ScaleMode.FIT,
236208// toneMapper = JxlToneMapper.REC2408,
237209// )
238- val srcImage = JxlCoder .decode(
210+
211+ // Resizable version
212+ val srcImage = JxlCoder .decodeSampled(
239213 buffer4,
214+ width = largeImageSize.width / 2 ,
215+ height = largeImageSize.height / 2 ,
240216 preferredColorConfig = PreferredColorConfig .HARDWARE ,
241217 com.awxkee.jxlcoder.ScaleMode .FIT ,
242218 toneMapper = JxlToneMapper .REC2408 ,
219+ jxlResizeFilter = JxlResizeFilter .LANCZOS
243220 )
244- val fosRec2408 = FileOutputStream (File (cacheDir, File (asset).nameWithoutExtension + " .jpg" ))
245- fosRec2408.use {
246- srcImage.compress(Bitmap .CompressFormat .JPEG , 90 , it)
247- it.flush()
221+ lifecycleScope.launch {
222+ imagesArray.add(srcImage)
248223 }
249- // val srcPerceptual = JxlCoder.decodeSampled(
250- // buffer4,
251- // largeImageSize.width / 2,
252- // largeImageSize.height / 2,
253- // preferredColorConfig = PreferredColorConfig.HARDWARE,
254- // com.awxkee.jxlcoder.ScaleMode.FIT,
255- // toneMapper = JxlToneMapper.REC2408_PERCEPTUAL,
256- // )
257- val srcPerceptual = JxlCoder .decode(
224+ val srcImage1 = JxlCoder .decodeSampled(
258225 buffer4,
226+ width = largeImageSize.width / 2 ,
227+ height = largeImageSize.height / 2 ,
259228 preferredColorConfig = PreferredColorConfig .HARDWARE ,
260229 com.awxkee.jxlcoder.ScaleMode .FIT ,
261230 toneMapper = JxlToneMapper .REC2408_PERCEPTUAL ,
231+ jxlResizeFilter = JxlResizeFilter .NEAREST
262232 )
263- val fosRec2408Perc = FileOutputStream (File (cacheDir, File (asset).nameWithoutExtension + " _perceptual.jpg" ))
264- fosRec2408Perc.use {
265- srcPerceptual.compress(Bitmap .CompressFormat .JPEG , 90 , it)
266- it.flush()
233+ lifecycleScope.launch {
234+ imagesArray.add(srcImage1)
267235 }
268- // val srcImage = JxlCoder.decode(buffer4,
269- // preferredColorConfig = PreferredColorConfig.RGB_565,
270- // toneMapper = JxlToneMapper.REC2408)
236+ val srcImage2 = JxlCoder .decodeSampled(
237+ buffer4,
238+ width = largeImageSize.width / 2 ,
239+ height = largeImageSize.height / 2 ,
240+ preferredColorConfig = PreferredColorConfig .HARDWARE ,
241+ com.awxkee.jxlcoder.ScaleMode .FIT ,
242+ toneMapper = JxlToneMapper .FILMIC ,
243+ jxlResizeFilter = JxlResizeFilter .NEAREST
244+ )
271245 lifecycleScope.launch {
272- imagesArray.add(srcImage)
273- imagesArray.add(srcPerceptual)
246+ imagesArray.add(srcImage2)
247+ }
248+ val srcImage3 = JxlCoder .decodeSampled(
249+ buffer4,
250+ width = largeImageSize.width / 2 ,
251+ height = largeImageSize.height / 2 ,
252+ preferredColorConfig = PreferredColorConfig .HARDWARE ,
253+ com.awxkee.jxlcoder.ScaleMode .FIT ,
254+ toneMapper = JxlToneMapper .ACES ,
255+ jxlResizeFilter = JxlResizeFilter .NEAREST
256+ )
257+ lifecycleScope.launch {
258+ imagesArray.add(srcImage3)
274259 }
275-
276260 }
277- Log .d(" JXLCoder" , " Decoding done in ${time} ms" )
261+ Log .d(" JXLMain" , " Decoding time ${decodingTime} ms" )
262+ launch {
263+ delay(1500 )
264+ Log .d(" JXLMain" , " Decoding time ${decodingTime} ms" )
265+ }
278266 }
279267 } catch (e: Exception ) {
280268 if (e !is FileNotFoundException ) {
@@ -289,25 +277,6 @@ class MainActivity : ComponentActivity() {
289277 modifier = Modifier .fillMaxSize(),
290278 color = MaterialTheme .colorScheme.background
291279 ) {
292- // AsyncImage(
293- // model = "https://pdfconverter1984.blob.core.windows.net/simple/wide_gamut.jxl",
294- // contentDescription = null,
295- // imageLoader = ImageLoader.Builder(this)
296- // .components {
297- // add(JxlDecoder.Factory())
298- // }
299- // .build()
300- // )
301-
302- // Image(
303- // bitmap = image.asImageBitmap(),
304- // // painter = rememberDrawablePainter(drawable = drawable),
305- // modifier = Modifier
306- // .fillMaxWidth()
307- // .fillMaxHeight(),
308- // contentScale = ContentScale.FillWidth,
309- // contentDescription = "ok"
310- // )
311280 LazyColumn (
312281 modifier = Modifier
313282 .fillMaxSize()
@@ -322,17 +291,6 @@ class MainActivity : ComponentActivity() {
322291 contentDescription = " ok"
323292 )
324293 }
325-
326- // items(drawablesArray.count(), key = {
327- // return@items UUID.randomUUID().toString()
328- // }) {
329- // Image(
330- // rememberDrawablePainter(drawable = drawablesArray[it]),
331- // modifier = Modifier.fillMaxWidth(),
332- // contentScale = ContentScale.FillWidth,
333- // contentDescription = "ok"
334- // )
335- // }
336294 }
337295 }
338296 }
0 commit comments