Skip to content

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 →