Pixel, Excel, Kotlin und ein bisschen Nostalgie ...

Hallo, alle miteinander! Die Idee für diesen Artikel kam vor einem Monat, aber da ich bei der Arbeit beschäftigt war, fehlte mir die Zeit. Eines Abends stieß ich auf YouTube auf ein Video über das Erstellen eines Pixel-Art-Plattformspiels. Und dann erinnerte ich mich an meinen ersten Informatikunterricht in der Schule, in dem wir "BASIC eingezeichnet" und "die Krähe isst Buchstaben" gespielt haben.





Vorwort

Das Jahr war 2000. Die Krise von 98 ist vorbei. Ich war in der 8. Klasse einer örtlichen Schule in einer kleinen Stadt. Zu Beginn des Schuljahres erwartete alle eine kleine Veranstaltung - eine Informatikstunde wurde eingeführt. Viele behandelten dies als ein weiteres Fach, das unterrichtet werden muss, aber es gab auch solche, deren Augen leuchteten. Ich war unter den letzteren.





Es sei darauf hingewiesen, dass die Informatik zwar eingeführt wurde, sie jedoch vergaßen, "neue Computer einzuführen", da für diese Zwecke kein Geld zur Verfügung stand. Zu dieser Zeit wurde unsere Schule von Maschinen aus der UdSSR - " Electronics MC 0511 " - und einigen ihrer etwas moderneren Gegenstücke bedient. Sie arbeiteten nur nach ihren eigenen Gesetzen oder nach der Ankunft eines bestimmten "Nikolai Vladimirovich" - eines örtlichen Meisters.





Foto von der Website - red-innovations.su
Foto von der Website - red-innovations.su

"" - 26 , . . . , . , .





, , . - , , .





BufferedImage. , .





fun drawPixel(
    x:Int, y:Int, red:Int, green:Int, blue: Int,
    image: BufferedImage
) {
    image.setRGB(x, y, Color(red,green,blue).rgb)
}
      
      



, . , - redRng, greenRng blueRng .





fun drawRandImage( 
    image: BufferedImage, stepSize: Int = 1,  
    redRng: Int = 255, greenRng: Int = 255, blueRng: Int = 255
) { 
    for(posX in 0 until image.width step stepSize){ 
        for (posY in 0 until image.height step stepSize) {
            val r = if (redRng <= 0) 0 else Random.nextInt(0, redRng) 
            val g = if (greenRng <= 0) 0 else Random.nextInt(0, greenRng)
            val b = if (blueRng <= 0) 0 else Random.nextInt(0, blueRng) 
            drawPixel(posX, posY, r, g, b, image) 
        }  
    }
}
      
      



stepSize , .





Zufallsbild 1.) Schritt 3, RGB (11, 238, 229) 2.) Schritt 2, RGB (181, 19, 227)
1.) step 3, RGB (11, 238, 229) 2.) step 2, RGB (181, 19, 227)

- . . ImageIO. - , Thread.





fun writeImage(img: BufferedImage, file: String) {
    val imgthread = Thread(Runnable {
        ImageIO.write(img, File(file).extension, File(file))
    })
    try {
        imgthread.start()
    } catch (ex: Exception) {
        ex.printStackTrace()
        imgthread.interrupt()
    }
}
      
      



, "" .





ArrayList<List<Int>>. "" drawTitle, "" drawPixel, "big pixel" .





fun drawTile(
    startX: Int, startY: Int, size: Int, 
    red: Int, green: Int, blue: Int, image: BufferedImage
) {
    for (posX in startX until startX+size) {
        for (posY in startY until startY+size) {
            drawPixel(posX,posY,red,green,blue,image)
        }
    }
}
      
      



. -. when 4 …





fun drawImage(pixels: ArrayList<List<Int>>, image: BufferedImage) {
    pixels.forEachIndexed { posY, row ->
        row.forEachIndexed { posX, col ->
            when(col) {
                1 -> drawTile(posX*10,posY*10,10,255,2,0,image)
                2 -> drawTile(posX*10,posY*10,10,156,25,31,image)
                3 -> drawTile(posX*10,posY*10,10,255,255,255,image)
                else -> drawTile(posX*10,posY*10,10,23,0,44,image)
            }
        }
    }
}
      
      



… , (1 = , 2 = -, 3 = , 4 = )





val map = arrayListOf(
    listOf(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
    listOf(0,0,0,1,1,1,0,0,0,1,2,2,0,0,0),
    listOf(0,0,1,3,3,1,1,0,1,1,1,2,2,0,0),
    listOf(0,1,3,3,1,1,1,1,1,1,1,1,2,2,0),
    listOf(0,1,3,1,1,1,1,1,1,1,1,1,2,2,0),
    listOf(0,1,1,1,1,1,1,1,1,1,1,1,2,2,0),
    listOf(0,1,1,1,1,1,1,1,1,1,1,1,2,2,0),
    listOf(0,0,1,1,1,1,1,1,1,1,1,2,2,0,0),
    listOf(0,0,0,1,1,1,1,1,1,1,2,2,0,0,0),
    listOf(0,0,0,0,1,1,1,1,1,2,2,0,0,0,0),
    listOf(0,0,0,0,0,1,1,1,2,2,0,0,0,0,0),
    listOf(0,0,0,0,0,0,1,2,2,0,0,0,0,0,0),
    listOf(0,0,0,0,0,0,0,2,0,0,0,0,0,0,0),
    listOf(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0),
)
      
      



... . "" .





Pixelherz
pixel heart

, " " , - , . , , .





Excel

. JS (React JS), , JavaScript . - …





, Excel. - . . " " - , Apache POI - word, excel, pdf. , .





hex rgba, Color.





val toRGBA = { hex: String ->
    val red = hex.toLong(16) and 0xff0000 shr 16
    val green = hex.toLong(16) and 0xff00 shr 8
    val blue = hex.toLong(16) and 0xff
    val alpha = hex.toLong(16) and 0xff000000 shr 24
    Color(red.toInt(),green.toInt(),blue.toInt(),alpha.toInt())
}
      
      



, .





fun getPixelColors(file: String, listName: String): ArrayList<List<String>> {
    val table = FileInputStream(file)
    val sheet = WorkbookFactory.create(table).getSheet(listName)

    val rowIterator: Iterator<Row> = sheet.iterator()
    val rowArray: ArrayList<Int> = ArrayList()
    val cellArray: ArrayList<Int> = ArrayList()

    while (rowIterator.hasNext()) {
        val row: Row = rowIterator.next()
        rowArray.add(row.rowNum)
        val cellIterator = row.cellIterator()

        while (cellIterator.hasNext()) {
            val cell = cellIterator.next()
            cellArray.add(cell.address.column)
        }
    }
    val rowSize = rowArray.maxOf { el->el }
    //...   
    //...  
    return pixelMatrix
}
      
      



( ). , , . .





, , . ...





val rows = sheet.lastRowNum
val cells = sheet.getRow(rows).lastCellNum // + rows

val pixArray = Array(rows+1) {Array(ccc+1) {""} }
      
      



... OutOfBounds. (row) , , . , "", . iterator.hasNext(), .





Pixel-Editor in Excel
Excel

- " " BufferedImage. , - TYPE_INT_ARGB, .





fun renderImage(pixels: ArrayList<List<String>>): BufferedImage {
    val resultImage = BufferedImage(
        pixels[0].size*10,
        pixels.size*10,
        BufferedImage.TYPE_INT_ARGB
    )
    pixels.forEachIndexed { posY, row ->
        row.forEachIndexed { posX, col ->
            drawTile(
                (posX)*10,(posY)*10, 10,
                toRGBA(col).red, toRGBA(col).green,toRGBA(col).blue,
                toRGBA(col).alpha, resultImage
            )
        }
    }
    return resultImage
}
      
      



, .





gerendertes Bild in Excel.  basierend auf der Arbeit von Mockingjay1701
Excel. Mockingjay1701

github. ? svg, (blur, glitch, glow, etc..), “ ” , xls (HSSF Color) . - , , - .





, " " (ctrl+c, ctrl+v), "" . , : , , - " ". , , , .





14 , , .





Selbst wenn in ein paar Jahren "MS Electronics" durch moderne Pentium-basierte Gegenstücke ersetzt wurde, werden diese ersten Lektionen auf alten Computern für immer bei mir bleiben, denn sie haben meine Liebe zu Computern und allem, was damit zu tun hat, in mich gesteckt. ..





Wie hat die Informatik an Ihrer Schule angefangen?





Danke an alle! Tschüss zusammen!








All Articles