Anmol Verma
11/02/2022, 4:24 AMMichael Paus
11/02/2022, 10:00 AMAnmol Verma
11/02/2022, 10:14 AMMichael Paus
11/02/2022, 10:17 AMAnmol Verma
11/02/2022, 10:19 AMMichael Paus
11/02/2022, 10:20 AMAnmol Verma
11/02/2022, 10:21 AMMichael Paus
11/02/2022, 10:24 AMAnmol Verma
11/02/2022, 10:24 AMMichael Paus
11/02/2022, 10:26 AMpackage de.mpmediasoft.system.internal
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.asComposeImageBitmap
import androidx.compose.ui.graphics.toComposeImageBitmap
import de.mpmediasoft.system.ImageFactory
import org.jetbrains.skia.Bitmap
import org.jetbrains.skia.ColorAlphaType
import org.jetbrains.skia.Image
import org.jetbrains.skia.ImageInfo
actual class ImageFactoryImpl actual constructor() : ImageFactory {
override fun imageBitmapFromBytes(encodedImageData: ByteArray): ImageBitmap {
return Image.makeFromEncoded(encodedImageData).toComposeImageBitmap()
}
override fun imageBitmapFromArgb(rawArgbImageData: IntArray, width: Int, height: Int): ImageBitmap {
val bytesPerPixel = 4
val pixels = ByteArray(width * height * bytesPerPixel)
var k = 0
for (y in 0 until height) {
for (x in 0 until width) {
val argb = rawArgbImageData[y * width + x]
val a = (argb shr 24) and 0xff
val r = (argb shr 16) and 0xff
val g = (argb shr 8) and 0xff
val b = (argb shr 0) and 0xff
pixels[k++] = b.toByte()
pixels[k++] = g.toByte()
pixels[k++] = r.toByte()
pixels[k++] = a.toByte()
}
}
return imageBitmapFromArgb(pixels, width, height)
}
fun imageBitmapFromArgb(rawArgbImageData: ByteArray, width: Int, height: Int): ImageBitmap {
val bitmap = Bitmap()
bitmap.allocPixels(ImageInfo.makeS32(width, height, ColorAlphaType.UNPREMUL))
bitmap.installPixels(rawArgbImageData)
return bitmap.asComposeImageBitmap()
}
}
package de.mpmediasoft.system
import androidx.compose.ui.graphics.ImageBitmap
interface ImageFactory {
fun imageBitmapFromBytes(encodedImageData: ByteArray): ImageBitmap
fun imageBitmapFromArgb(rawArgbImageData: IntArray, width: Int, height: Int): ImageBitmap
}
You’ll only need the method imageBitmapFromBytes
.Anmol Verma
11/02/2022, 10:32 AMMichael Paus
11/02/2022, 10:41 AMpackage de.mpmediasoft.system.internal
import android.graphics.BitmapFactory
import androidx.compose.ui.graphics.ImageBitmap
import androidx.compose.ui.graphics.ImageBitmapConfig
import androidx.compose.ui.graphics.asAndroidBitmap
import androidx.compose.ui.graphics.asImageBitmap
import androidx.compose.ui.graphics.colorspace.ColorSpaces
import de.mpmediasoft.system.ImageFactory
actual class ImageFactoryImpl actual constructor() : ImageFactory {
// Android implementation
override fun imageBitmapFromBytes(encodedImageData: ByteArray): ImageBitmap {
return BitmapFactory.decodeByteArray(encodedImageData, 0, encodedImageData.size).asImageBitmap()
}
override fun imageBitmapFromArgb(rawArgbImageData: IntArray, width: Int, height: Int): ImageBitmap {
val image = ImageBitmap(width, height, ImageBitmapConfig.Argb8888, true, ColorSpaces.Srgb)
image.asAndroidBitmap().setPixels(rawArgbImageData, 0, width, 0, 0, width, height)
return image
}
}
Anmol Verma
11/02/2022, 10:42 AMremember { BitmapPainter(ImageFactory.imageBitmapFromBytes(byte-array-from-moko-resource?)) }
and here byte-array will come from moko-resources ?Michael Paus
11/02/2022, 10:44 AMAnmol Verma
11/02/2022, 10:45 AMAnmol Verma
11/02/2022, 10:46 AMval painter = remember { UIImage.imageNamed(imageResourceName)?.toSkiaImage()?.toComposeImageBitmap()?.let(::BitmapPainter) }
looks like a good impl ?Michael Paus
11/02/2022, 10:51 AMAnmol Verma
11/02/2022, 10:51 AMAnmol Verma
11/02/2022, 10:56 AMUIImage.imageNamed
is from ios platform , and it uses the ios project resources , basically reading from the xcodeproject. blob thinking upside downAnmol Verma
11/02/2022, 10:59 AM