Skip to content

Commit ad303d5

Browse files
committed
优化项目,增加更多格式支持
1 parent b9ffeb8 commit ad303d5

13 files changed

+310
-53
lines changed

desktop/src/jvmMain/kotlin/Main.kt

+28-2
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,42 @@
1+
import androidx.compose.foundation.Image
2+
import androidx.compose.foundation.layout.Column
3+
import androidx.compose.foundation.layout.Row
4+
import androidx.compose.foundation.layout.size
15
import androidx.compose.material.MaterialTheme
6+
import androidx.compose.ui.Modifier
7+
import androidx.compose.ui.unit.dp
28
import androidx.compose.ui.window.Window
39
import androidx.compose.ui.window.application
410
import com.lt.common.App
511
import com.lt.load_the_image.LoadTheImageManager
12+
import java.io.File
613

714
fun main() {
815
LoadTheImageManager.defaultErrorImagePath = "drawable-xxhdpi/load_error.jpeg"
916
application {
1017
Window(onCloseRequest = ::exitApplication) {
1118
MaterialTheme {
12-
App()
13-
//Image(com.lt.load_the_image.rememberImagePainter("https://ss2.baidu.com/-vo3dSag_xI4khGko9WTAnF6hhy/baike/pic/item/e850352ac65c10380e49077eba119313b07e8953.jpg","drawable-xxhdpi/img_a.jpeg"), "", Modifier.size(500.dp))
19+
Column {
20+
Row {
21+
Image(
22+
com.lt.load_the_image.rememberImagePainter(
23+
"https://ss2.baidu.com/-vo3dSag_xI4khGko9WTAnF6hhy/baike/pic/item/e850352ac65c10380e49077eba119313b07e8953.jpg",
24+
"drawable-xxhdpi/img_a.jpeg"
25+
), "", Modifier.size(50.dp)
26+
)
27+
Image(
28+
com.lt.load_the_image.rememberImagePainter(
29+
File("C:\\SpringBootFiles\\imgs\\7633948650d6b30461fce6d13422ec3a.jpeg"),
30+
), "", Modifier.size(50.dp)
31+
)
32+
//Image(
33+
// com.lt.load_the_image.rememberImagePainter(
34+
// File("C:\\SpringBootFiles\\imgs\\7633948650d6b30461fce6d13422ec3a.jpeg").inputStream(),
35+
// ), "", Modifier.size(50.dp)
36+
//)
37+
}
38+
App()
39+
}
1440
}
1541
}
1642
}

load-the-image/src/main/java/com/lt/load_the_image/LoadTheImageManager.kt

+9-9
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import com.lt.load_the_image.cache.ImageFileCache
1212
import com.lt.load_the_image.cache.ImageLruMemoryCache
1313
import com.lt.load_the_image.loader.*
1414
import com.lt.load_the_image.painter.DefaultPainterCreator
15-
import com.lt.load_the_image.painter.HttpImagePainter
15+
import com.lt.load_the_image.painter.EmptyImagePainter
1616
import com.lt.load_the_image.painter.PainterCreator
1717

1818
/**
@@ -46,6 +46,10 @@ object LoadTheImageManager {
4646
HttpLoadTheImage(),
4747
FileLoadTheImage(),
4848
ResourcesLoadTheImage(),
49+
BitmapLoadTheImage(),
50+
ImageLoadTheImage(),
51+
ByteArrayLoadTheImage(),
52+
InputStreamLoadTheImage(),
4953
)
5054

5155
/**
@@ -57,16 +61,12 @@ object LoadTheImageManager {
5761
* Load the image
5862
*/
5963
@Composable
60-
fun load(url: String): Painter {
61-
if (url.isEmpty()) {
62-
println("Load the image error: Url is Empty")
63-
return createErrorPainter()
64-
}
64+
fun load(data: DataToBeLoaded): Painter {
6565
val loader = remember {
66-
loadTheImage.find { it.canLoad(url) }
66+
loadTheImage.find { it.canLoad(data) }
6767
}
6868
if (loader != null)
69-
return loader.load(url)
69+
return loader.load(data)
7070
?: kotlin.run {
7171
println("Load the image error: Exception loading URL")
7272
createErrorPainter()
@@ -79,7 +79,7 @@ object LoadTheImageManager {
7979
@Composable
8080
private fun createErrorPainter(): Painter {
8181
if (defaultErrorImagePath.isEmpty())
82-
return HttpImagePainter()
82+
return EmptyImagePainter()
8383
return painterResource(defaultErrorImagePath)
8484
}
8585

Original file line numberDiff line numberDiff line change
@@ -1,31 +1,84 @@
11
package com.lt.load_the_image
22

33
import androidx.compose.runtime.Composable
4-
import androidx.compose.runtime.remember
54
import androidx.compose.ui.graphics.painter.Painter
6-
import com.lt.load_the_image.painter.HttpImagePainter
5+
import com.lt.load_the_image.loader.DataToBeLoaded
6+
import org.jetbrains.skia.Bitmap
7+
import org.jetbrains.skia.Image
8+
import java.io.File
9+
import java.io.InputStream
710

811
/**
912
* Load the image to @Composable Image
1013
* [url]Can use Net url or native url
14+
* [placeholderResource]Bitmap when loading network pictures (resource)
1115
*/
1216
@Composable
13-
fun rememberImagePainter(url: String): Painter {
14-
return LoadTheImageManager.load(url)
17+
fun rememberImagePainter(url: String, placeholderResource: String = ""): Painter {
18+
val data = DataToBeLoaded(url)
19+
data.placeholderResource = placeholderResource
20+
return rememberImagePainter(data)
1521
}
1622

1723
/**
1824
* Load the image to @Composable Image
19-
* [url]Can use Net url or native url
25+
* [file]Local file
26+
*/
27+
@Composable
28+
fun rememberImagePainter(file: File): Painter {
29+
return LoadTheImageManager.load(DataToBeLoaded(file))
30+
}
31+
32+
/**
33+
* Load the image to @Composable Image
34+
* [bitmap]The [Bitmap]
35+
*/
36+
@Composable
37+
fun rememberImagePainter(bitmap: Bitmap): Painter {
38+
return LoadTheImageManager.load(DataToBeLoaded(bitmap))
39+
}
40+
41+
/**
42+
* Load the image to @Composable Image
43+
* [image]The [Image]
44+
*/
45+
@Composable
46+
fun rememberImagePainter(image: Image): Painter {
47+
return LoadTheImageManager.load(DataToBeLoaded(image))
48+
}
49+
50+
/**
51+
* Load the image to @Composable Image
52+
* [byteArray]Bytes of image
53+
*/
54+
@Composable
55+
fun rememberImagePainter(byteArray: ByteArray): Painter {
56+
return LoadTheImageManager.load(DataToBeLoaded(byteArray))
57+
}
58+
59+
/**
60+
* Load the image to @Composable Image
61+
* [inputStream]InputStream of image
2062
* [placeholderResource]Bitmap when loading network pictures (resource)
63+
* [isAutoCloseStream]Whether to close the stream automatically
64+
*/
65+
@Composable
66+
fun rememberImagePainter(
67+
inputStream: InputStream,
68+
placeholderResource: String = "",
69+
isAutoCloseStream: Boolean = true
70+
): Painter {
71+
val data = DataToBeLoaded(inputStream)
72+
data.placeholderResource = placeholderResource
73+
data.isAutoCloseStream = isAutoCloseStream
74+
return rememberImagePainter(data)
75+
}
76+
77+
/**
78+
* Load the image to @Composable Image
79+
* [data]Self assembling data
2180
*/
2281
@Composable
23-
fun rememberImagePainter(url: String, placeholderResource: String): Painter {
24-
val painter = rememberImagePainter(url)
25-
remember(url) {
26-
if (painter is HttpImagePainter && painter.imageBitmap.value == null)
27-
painter.imageBitmap.value =
28-
LoadTheImageManager.loadResourceImageBitmap(placeholderResource)
29-
}
30-
return painter
82+
fun rememberImagePainter(data: DataToBeLoaded): Painter {
83+
return LoadTheImageManager.load(data)
3184
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.lt.load_the_image.loader
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.ui.graphics.asComposeImageBitmap
5+
import androidx.compose.ui.graphics.painter.BitmapPainter
6+
import androidx.compose.ui.graphics.painter.Painter
7+
import org.jetbrains.skia.Bitmap
8+
9+
/**
10+
* creator: lt 2022/6/1 [email protected]
11+
* effect : Load the image from [Bitmap]
12+
* warning:
13+
*/
14+
class BitmapLoadTheImage : LoadTheImage {
15+
@Composable
16+
override fun load(data: DataToBeLoaded): Painter? {
17+
val bitmap = data.data as? Bitmap ?: return null
18+
return BitmapPainter(bitmap.asComposeImageBitmap())
19+
}
20+
21+
override fun canLoad(data: DataToBeLoaded): Boolean {
22+
return data.data is Bitmap
23+
}
24+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.lt.load_the_image.loader
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.ui.graphics.painter.Painter
5+
import com.lt.load_the_image.LoadTheImageManager
6+
7+
/**
8+
* creator: lt 2022/6/1 [email protected]
9+
* effect : Load the image from [ByteArray] of image
10+
* warning:
11+
*/
12+
class ByteArrayLoadTheImage : LoadTheImage {
13+
@Composable
14+
override fun load(data: DataToBeLoaded): Painter? {
15+
val byteArray = data.data as? ByteArray ?: return null
16+
return LoadTheImageManager.painterCreator.create(byteArray)
17+
}
18+
19+
override fun canLoad(data: DataToBeLoaded): Boolean {
20+
return data.data is ByteArray
21+
}
22+
}

load-the-image/src/main/java/com/lt/load_the_image/loader/FileLoadTheImage.kt

+16-6
Original file line numberDiff line numberDiff line change
@@ -13,20 +13,30 @@ import java.io.File
1313
*/
1414
open class FileLoadTheImage : LoadTheImage {
1515
@Composable
16-
override fun load(url: String): Painter? {
17-
val file = File(url)
18-
val byteArray = LoadTheImageManager.memoryCache.getCache(url) ?: try {
16+
override fun load(data: DataToBeLoaded): Painter? {
17+
val file = if (data.data is String)
18+
File(data.data)
19+
else if (data.data is File)
20+
data.data
21+
else
22+
return null
23+
val byteArray = LoadTheImageManager.memoryCache.getCache(file.absolutePath) ?: try {
1924
file.readBytes()
2025
} catch (e: Exception) {
2126
e.println()
2227
return null
2328
}
24-
LoadTheImageManager.memoryCache.saveCache(url, byteArray)
29+
LoadTheImageManager.memoryCache.saveCache(file.absolutePath, byteArray)
2530
return LoadTheImageManager.painterCreator.create(byteArray)
2631
}
2732

28-
override fun canLoad(url: String): Boolean {
29-
val file = File(url)
33+
override fun canLoad(data: DataToBeLoaded): Boolean {
34+
val file = if (data.data is String)
35+
File(data.data)
36+
else if (data.data is File)
37+
data.data
38+
else
39+
return false
3040
if (file.exists() && file.isFile)
3141
return true
3242
return false

load-the-image/src/main/java/com/lt/load_the_image/loader/HttpLoadTheImage.kt

+25-15
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import androidx.compose.runtime.LaunchedEffect
55
import androidx.compose.ui.graphics.painter.Painter
66
import androidx.compose.ui.graphics.toComposeImageBitmap
77
import com.lt.load_the_image.LoadTheImageManager
8-
import com.lt.load_the_image.painter.HttpImagePainter
8+
import com.lt.load_the_image.painter.AsyncImagePainter
99
import kotlinx.coroutines.Dispatchers
1010
import kotlinx.coroutines.withContext
1111
import org.jetbrains.skia.Image
@@ -18,22 +18,31 @@ import org.jetbrains.skia.Image
1818
open class HttpLoadTheImage : LoadTheImage {
1919

2020
@Composable
21-
override fun load(url: String): Painter? {
22-
val painter = HttpImagePainter()
23-
LaunchedEffect(url, painter) {
21+
override fun load(data: DataToBeLoaded): Painter? {
22+
val url = data.data as? String ?: return null
23+
val painter = AsyncImagePainter()
24+
LaunchedEffect(url) {
2425
withContext(Dispatchers.IO) {
25-
val byteArray =
26+
//Use cache
27+
var byteArray =
2628
LoadTheImageManager.memoryCache.getCache(url)
2729
?: LoadTheImageManager.fileCache.getCache(url)
28-
?: LoadTheImageManager.httpLoader.load(url)
29-
?: kotlin.run {
30-
//Handling exceptions
31-
val errorImagePath = LoadTheImageManager.defaultErrorImagePath
32-
if (errorImagePath.isNotEmpty())
33-
painter.imageBitmap.value =
34-
LoadTheImageManager.loadResourceImageBitmap(errorImagePath)
35-
return@withContext
36-
}
30+
if (byteArray == null) {
31+
val placeholderResource = data.placeholderResource
32+
if (placeholderResource.isNotEmpty())
33+
painter.imageBitmap.value =
34+
LoadTheImageManager.loadResourceImageBitmap(placeholderResource)
35+
//Load with http
36+
byteArray = LoadTheImageManager.httpLoader.load(url)
37+
if (byteArray == null) {
38+
//Handling exceptions
39+
val errorImagePath = LoadTheImageManager.defaultErrorImagePath
40+
if (errorImagePath.isNotEmpty())
41+
painter.imageBitmap.value =
42+
LoadTheImageManager.loadResourceImageBitmap(errorImagePath)
43+
return@withContext
44+
}
45+
}
3746
LoadTheImageManager.memoryCache.saveCache(url, byteArray)
3847
LoadTheImageManager.fileCache.saveCache(url, byteArray)
3948
val imageBitmap = Image.makeFromEncoded(byteArray).toComposeImageBitmap()
@@ -43,7 +52,8 @@ open class HttpLoadTheImage : LoadTheImage {
4352
return painter
4453
}
4554

46-
override fun canLoad(url: String): Boolean {
55+
override fun canLoad(data: DataToBeLoaded): Boolean {
56+
val url = data.data as? String ?: return false
4757
if (url.startsWith("http://") || url.startsWith("https://"))
4858
return true
4959
return false
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.lt.load_the_image.loader
2+
3+
import androidx.compose.runtime.Composable
4+
import androidx.compose.ui.graphics.painter.BitmapPainter
5+
import androidx.compose.ui.graphics.painter.Painter
6+
import androidx.compose.ui.graphics.toComposeImageBitmap
7+
import org.jetbrains.skia.Image
8+
9+
/**
10+
* creator: lt 2022/6/1 [email protected]
11+
* effect : Load the image from [Image]
12+
* warning:
13+
*/
14+
class ImageLoadTheImage : LoadTheImage {
15+
@Composable
16+
override fun load(data: DataToBeLoaded): Painter? {
17+
val image = data.data as? Image ?: return null
18+
return BitmapPainter(image.toComposeImageBitmap())
19+
}
20+
21+
override fun canLoad(data: DataToBeLoaded): Boolean {
22+
return data.data is Image
23+
}
24+
}

0 commit comments

Comments
 (0)