Stefan Oltmann
03/22/2024, 10:51 AMAlbert Chang
03/22/2024, 12:17 PMCATMULL_ROM
or MITCHELL
.Stefan Oltmann
03/22/2024, 12:28 PMStefan Oltmann
03/22/2024, 12:29 PMAlbert Chang
03/22/2024, 12:57 PMPaint.setAntiAlias
in Android (which uses Skia):
> AntiAliasing smooths out the edges of what is being drawn, but is has no impact on the interior of the shape.
As the doc suggests, anti aliasing only affects edges, and the edges of an image is just a rectengle.Stefan Oltmann
03/22/2024, 12:59 PMStefan Oltmann
03/22/2024, 1:01 PMAlbert Chang
03/22/2024, 1:08 PMStefan Oltmann
03/22/2024, 1:18 PMStefan Oltmann
03/22/2024, 1:24 PMStefan Oltmann
03/22/2024, 1:24 PMAlbert Chang
03/22/2024, 1:32 PMImage.scalePixels()
?Stefan Oltmann
03/22/2024, 1:32 PMStefan Oltmann
03/22/2024, 1:33 PMAlbert Chang
03/22/2024, 1:39 PMStefan Oltmann
03/22/2024, 1:40 PMAlbert Chang
03/22/2024, 1:42 PMImage.scalePixels().
Stefan Oltmann
03/22/2024, 1:53 PMStefan Oltmann
03/22/2024, 1:54 PMspierce7
03/22/2024, 1:56 PMspierce7
03/22/2024, 1:58 PMStefan Oltmann
03/22/2024, 1:59 PMAlbert Chang
03/22/2024, 1:59 PMval pixmap = Pixmap()
image.scalePixels(pixmap, SamplingMode.LINEAR, false)
val scaledImage = Image.makeFromPixmap(pixmap)
spierce7
03/22/2024, 1:59 PMStefan Oltmann
03/22/2024, 2:11 PMval pixmap = Pixmap()
image.scalePixels(pixmap, SamplingMode.LINEAR, false)
val scaledImage = Image.makeFromPixmap(pixmap)That would be too easy. ๐ Also there must be a way to specify the target size.
Failed to Image::makeFromRaster Pixmap(_ptr=0x600002e71170)
Albert Chang
03/22/2024, 2:22 PMval bitmap = Bitmap()
bitmap.allocN32Pixels(480, 320)
image.scalePixels(bitmap.peekPixels()!!, SamplingMode.LINEAR, false)
val scaledImage = Image.makeFromBitmap(bitmap)
Stefan Oltmann
03/22/2024, 2:32 PMspierce7
03/22/2024, 2:33 PMStefan Oltmann
03/22/2024, 2:34 PMStefan Oltmann
03/22/2024, 2:34 PMspierce7
03/22/2024, 2:35 PMspierce7
03/22/2024, 2:35 PMspierce7
03/22/2024, 2:37 PMscalePixels
does seem promising though because you can choose the algorithm. Have you gone through all the algorithm options?Stefan Oltmann
03/22/2024, 2:37 PMspierce7
03/22/2024, 2:38 PMStefan Oltmann
03/22/2024, 2:39 PMspierce7
03/22/2024, 2:41 PMStefan Oltmann
03/22/2024, 2:43 PMStefan Oltmann
03/22/2024, 2:47 PMAh right ๐ Maybe this?Yes. That's correct. I has the identical result as the other way. And the same speed. It's less code, so that's good.
Stefan Oltmann
03/22/2024, 2:47 PMspierce7
03/22/2024, 2:49 PMfun downscaleImageHighQuality(imageBitmap: ImageBitmap, targetWidth: Int, targetHeight: Int): ImageBitmap {
val sourceImage = Image.makeFromBitmap(imageBitmap.asDesktopBitmap())
// Create a paint object with high-quality filtering
val paint = Paint().apply {
// Set the filter quality to high
filterQuality = FilterQuality.High
}
// Perform the resizing with high-quality filtering
val resizedImage = sourceImage.resize(targetWidth, targetHeight, paint)
return resizedImage.asImageBitmap()
}
Stefan Oltmann
03/22/2024, 2:50 PMStefan Oltmann
03/22/2024, 2:51 PMfilterQuality
anymore. That's deprecated.
It's now isAntiAlias
. This has no effect on the image.Stefan Oltmann
03/22/2024, 2:51 PMspierce7
03/22/2024, 2:51 PMStefan Oltmann
03/22/2024, 2:52 PMStefan Oltmann
03/22/2024, 2:53 PMscalePixels
.
I'm so glad we have @Albert Chang with us. ๐spierce7
03/22/2024, 2:54 PMStefan Oltmann
03/22/2024, 2:55 PMStefan Oltmann
03/22/2024, 2:56 PMStefan Oltmann
03/22/2024, 3:01 PMStefan Oltmann
03/22/2024, 3:04 PMI would hazard a guess that it does progressive downsampling for any scale factor that is higher than 2.
romainguy
03/22/2024, 3:06 PMromainguy
03/22/2024, 3:07 PMStefan Oltmann
03/22/2024, 3:08 PMromainguy
03/22/2024, 3:09 PMStefan Oltmann
03/22/2024, 3:10 PMromainguy
03/22/2024, 3:10 PMromainguy
03/22/2024, 3:11 PMStefan Oltmann
03/22/2024, 3:11 PMStefan Oltmann
03/22/2024, 3:16 PMStefan Oltmann
03/22/2024, 3:17 PMdrawImageInRect
, but it has an effect on scalePixels
val bitmap = Bitmap()
bitmap.allocN32Pixels(thumbnailSize.width, thumbnailSize.height)
this.scalePixels(bitmap.peekPixels()!!, FilterMipmap(FilterMode.LINEAR, MipmapMode.LINEAR), false)
return Image.makeFromBitmap(bitmap)
Stefan Oltmann
03/22/2024, 3:25 PMromainguy
03/22/2024, 3:31 PMromainguy
03/22/2024, 3:31 PMStefan Oltmann
03/22/2024, 3:32 PMStefan Oltmann
03/22/2024, 3:32 PMromainguy
03/22/2024, 3:36 PMromainguy
03/22/2024, 3:36 PMStefan Oltmann
03/22/2024, 3:36 PMromainguy
03/22/2024, 3:37 PMStefan Oltmann
03/22/2024, 3:37 PMromainguy
03/22/2024, 3:37 PMStefan Oltmann
03/22/2024, 3:37 PMStefan Oltmann
03/22/2024, 3:38 PMromainguy
03/22/2024, 3:38 PMromainguy
03/22/2024, 3:39 PMStefan Oltmann
03/22/2024, 3:39 PMStefan Oltmann
03/22/2024, 3:40 PMStefan Oltmann
03/22/2024, 3:49 PMStefan Oltmann
03/22/2024, 3:52 PMsurface.canvas.drawImage(
image = downscaledImage,
left = 0f,
top = 0f,
paint = org.jetbrains.skia.Paint().apply {
imageFilter = ImageFilter.makeMatrixConvolution(
kernelW = 3,
kernelH = 3,
kernel = floatArrayOf(
0f, -1f, 0f,
-1f, 5f, -1f,
0f, -1f, 0f
),
gain = 1F,
bias = 0F,
offsetX = 1,
offsetY = 1,
tileMode = FilterTileMode.CLAMP,
convolveAlpha = false,
input = null,
crop = null
)
}
)
Stefan Oltmann
03/22/2024, 3:58 PM0f, -0.2f, 0f,
-0.2f, 1.8f, -0.2f,
0f, -0.2f, 0f
seems to be a good kernel by trial and error.Stefan Oltmann
03/22/2024, 3:59 PMromainguy
03/22/2024, 4:01 PMromainguy
03/22/2024, 4:01 PMStefan Oltmann
03/22/2024, 4:04 PM0f, -0.2f, 0f,
-0.2f, 1.8f, -0.2f,
0f, -0.2f, 0f
was given to me by ChatGPT, but it fails to come up with a kernel that's a little bit softerromainguy
03/22/2024, 4:17 PMromainguy
03/22/2024, 4:17 PMromainguy
03/22/2024, 4:17 PMromainguy
03/22/2024, 4:18 PM0.0625, 0.125, 0.0625,
0.125, 0.25, 0.125,
0.0625, 0.125, 0.0625
romainguy
03/22/2024, 4:18 PMStefan Oltmann
03/22/2024, 5:07 PMKirill Grouchnikov
03/22/2024, 8:23 PMStefan Oltmann
03/22/2024, 8:24 PMStefan Oltmann
03/22/2024, 8:25 PMKirill Grouchnikov
03/22/2024, 8:25 PMKirill Grouchnikov
03/22/2024, 8:25 PMKirill Grouchnikov
03/22/2024, 8:28 PMromainguy
03/22/2024, 8:31 PMKirill Grouchnikov
03/22/2024, 8:38 PMromainguy
03/22/2024, 8:41 PMStefan Oltmann
03/22/2024, 9:04 PMromainguy
03/22/2024, 9:12 PMromainguy
03/22/2024, 9:12 PMStefan Oltmann
03/22/2024, 10:22 PMromainguy
03/22/2024, 10:25 PMromainguy
03/22/2024, 10:25 PMStefan Oltmann
03/22/2024, 10:28 PMStefan Oltmann
03/22/2024, 10:33 PMStefan Oltmann
03/22/2024, 10:34 PMStefan Oltmann
03/22/2024, 10:35 PMStefan Oltmann
03/22/2024, 10:36 PMStefan Oltmann
03/22/2024, 10:47 PMStefan Oltmann
03/22/2024, 10:48 PMStefan Oltmann
03/22/2024, 10:50 PMromainguy
03/23/2024, 8:04 PMthat favors quality more.
romainguy
03/23/2024, 8:04 PMHenri Gourvest
03/26/2024, 12:15 PMStefan Oltmann
03/26/2024, 12:17 PMStefan Oltmann
03/26/2024, 12:18 PMHenri Gourvest
03/26/2024, 12:22 PMStefan Oltmann
03/26/2024, 12:38 PMStefan Oltmann
03/26/2024, 12:40 PMStefan Oltmann
03/26/2024, 12:42 PMromainguy
03/26/2024, 3:20 PMromainguy
03/26/2024, 3:20 PMromainguy
03/26/2024, 3:21 PMKirill Grouchnikov
03/26/2024, 4:29 PMromainguy
03/26/2024, 4:31 PMKirill Grouchnikov
03/26/2024, 4:55 PMStefan Oltmann
03/26/2024, 7:11 PMStefan Oltmann
03/26/2024, 7:16 PMromainguy
03/26/2024, 8:21 PMKirill Grouchnikov
03/26/2024, 10:04 PMSkColorType
?romainguy
03/26/2024, 10:34 PMromainguy
03/26/2024, 10:34 PMStefan Oltmann
03/27/2024, 1:18 PMStefan Oltmann
03/27/2024, 1:23 PMStefan Oltmann
03/27/2024, 1:26 PMKirill Grouchnikov
03/27/2024, 3:15 PMromainguy
03/27/2024, 3:18 PMStefan Oltmann
03/27/2024, 4:42 PMStefan Oltmann
03/27/2024, 5:29 PMStefan Oltmann
03/27/2024, 8:49 PMStefan Oltmann
03/27/2024, 10:05 PMMarcin Wisniowski
09/15/2024, 3:17 PMfun ImageBitmap.scale(width: Int, height: Int): ImageBitmap {
val image = Image.makeFromBitmap(asSkiaBitmap())
val scaled = image.scale(width, height)
return scaled.toComposeImageBitmap()
}
fun Image.scale(width: Int, height: Int): Image {
val bitmap = Bitmap()
bitmap.allocN32Pixels(width, height)
scalePixels(bitmap.peekPixels()!!, FilterMipmap(FilterMode.LINEAR, MipmapMode.LINEAR), false)
return Image.makeFromBitmap(bitmap)
}