Image Converter — Kotlin source
Convert images between PNG, JPEG and WebP entirely in your browser. Batch-friendly with quality control and a before/after size delta — nothing is uploaded.
This is the Kotlin implementation — the same logic the interactive tool runs, in a shareable, citable form.
// Image converter — Kotlin port of the image-converter tool.
import java.awt.Color
import java.awt.image.BufferedImage
import java.io.ByteArrayInputStream
import java.io.ByteArrayOutputStream
import javax.imageio.IIOImage
import javax.imageio.ImageIO
import javax.imageio.stream.ImageOutputStream
// Decode -> (JPEG only) flatten onto white -> encode at quality 0..1.
fun convertImage(input: ByteArray, target: String, quality: Float = 0.85f): ByteArray {
val src = ImageIO.read(ByteArrayInputStream(input))
// JPEG has no alpha channel: draw onto an opaque white canvas first,
// or transparent pixels render black in the encoded file.
val canvas =
if (target == "jpeg") BufferedImage(src.width, src.height, BufferedImage.TYPE_INT_RGB)
else src
if (canvas !== src) {
canvas.createGraphics().use { g ->
g.color = Color.WHITE
g.fillRect(0, 0, canvas.width, canvas.height)
g.drawImage(src, 0, 0, null)
}
}
val writer = ImageIO.getImageWritersByFormatName(target).next()
return ByteArrayOutputStream().use { out ->
ImageIO.createImageOutputStream(out).use { ios ->
writer.output = ios
val param = writer.defaultWriteParam.apply {
compressionMode = javax.imageio.ImageWriteParam.MODE_EXPLICIT
compressionQuality = quality
}
writer.write(null, IIOImage(canvas, null, null), param)
}
out.toByteArray()
}
}
fun main() {
val png = java.io.File("input.png").readBytes()
java.io.File("output.jpg").writeBytes(convertImage(png, "jpeg"))
}
Also available in 8 other languages
Every CosmoDev tool ships its pure logic in TypeScript (web) and Go (CLI), with authored implementations in a dozen-plus languages — the same contract, ported. Compare all languages side by side →