[Kotlin] Ich wollte ein PNG mit einer großen Kapazität pro Bereich generieren [Java]

Was ich machen wollte

Ein bestimmtes Projekt erforderte eine große Menge schwerer "png" -Bildmuster. Wenn andererseits das Bild in Form eines einfachen "Füllens" des Quadrats erzeugt wurde, wurde es komprimiert und wurde zu höchstens einigen KB, so dass die Kapazität nicht gesichert werden konnte. Da auch das erforderliche Bildformat festgelegt wurde, war es schwierig, die Fläche einfach zu vergrößern und die Kapazität zu erhöhen.

Politik

Die Komprimierung funktioniert normalerweise stark, wenn die folgenden zwei Punkte zutreffen.

Deshalb habe ich es mit dem Kleber gemacht: "Wenn Sie viele zufällige Linien mit zufälligen Farben zeichnen, wird es schwierig sein, sie zu komprimieren."

Das Ziel ist eine Größe von 1940 x 500 und 2 MB pro Blatt. Solange wir dies erreicht haben, werden wir dies tun, ohne uns um eine weitere Erhöhung der Kapazität und der Verarbeitungszeit sorgen zu müssen.

Implementierung

Dies ist ein Beispiel, das 2000 Bilder im Verzeichnis $ {project root} / build / generate generiert. Wenn es 100.000 "Zeilen" gibt, werden 2 MB stabil überschritten.

parallelStream () handelt von "Es wird etwas schneller sein", und ich habe nicht bestätigt, ob es tatsächlich schneller ist.

import java.awt.Color
import java.awt.Graphics2D
import java.awt.image.BufferedImage
import java.io.File
import javax.imageio.ImageIO
import kotlin.random.Random

const val width = 1940
const val height = 500
const val lines = 100000 //Anzahl der Zeilen
const val count = 2000

fun main() {
    val generateTarget = System.getProperty("user.dir") + "/build/generated/"

    List(count) { it }.parallelStream().forEach { index ->
        val img = BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR)
        (img.graphics as Graphics2D).apply {
            repeat(lines) {
                //Die Transparenz wird auch mit dem Ziel festgelegt, die Kapazität der Farbe so weit wie möglich zu erhöhen.
                this.color = Random.nextBytes(4).let {
                    Color(it[0] + 128, it[1] + 128, it[2] + 128, it[3] + 128)
                }
                this.drawLine(Random.nextInt(width), Random.nextInt(height), Random.nextInt(width), Random.nextInt(height))
            }
            dispose()
        }
        ImageIO.write(img, "png", File("$generateTarget${index}.png "))
    }
}

Ausführungsergebnis

Es war 4,81 GB mit 2000 Blatt und durchschnittlich 2,4 MB. Die Last war hoch und die Ausführungszeit dauerte einige Zeit. Ich denke, es ist am besten, sie in Ihrer Freizeit umzudrehen.

Ein solches Bild wird generiert. 0.png

Recommended Posts

[Kotlin] Ich wollte ein PNG mit einer großen Kapazität pro Bereich generieren [Java]
Ich möchte eine Liste mit Kotlin und Java erstellen!
Ich möchte eine Funktion mit Kotlin und Java erstellen!
Ich wollte (a == 1 && a == 2 && a == 3) in Java wahr machen
Ich habe versucht, den Block mit Java zu brechen (1)
Ich möchte Bildschirmübergänge mit Kotlin und Java machen!
Ich habe versucht, mit Chocolatey eine Java8-Entwicklungsumgebung zu erstellen
Ich habe versucht, eine Java EE-Anwendung mit OpenShift zu modernisieren.
Ich wollte nur eine reaktive Eigenschaft in Java erstellen
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben
Ich möchte verschiedene Funktionen mit Kotlin und Java implementieren!
Ich habe versucht, mit Java zu interagieren
Eine Geschichte, die ich mit Java nur schwer herausfordern konnte
Ich möchte mit Kotlin und Java zum vorherigen Bildschirm zurückkehren!
Eine Geschichte, die ich mit der Stream-API von Java8 einem Prozess schreiben wollte, der einer while-Anweisung entspricht
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (PowerMockito Edition)
Ich möchte mit Jakarta EE 8 mit Java 11 ein dunkles Web-SNS erstellen
Ich wollte eine Diashow mit Slick modisch umsetzen.
Ich habe eine Janken App mit Kotlin gemacht
Ich möchte für jedes Array mit Lambda-Ausdruck in Java
Sogar in Java möchte ich true mit == 1 && a == 2 && a == 3 ausgeben (Javassist zweite Abkochung)
[Java] Ich habe versucht, über den Verbindungspool eine Verbindung mit Servlet (Tomcat) & MySQL & Java herzustellen
Ich habe versucht, automatisch eine Klasse zu generieren, um sie mit APT von einer Datenklasse in ein Bundle zu konvertieren
Selbst in Java möchte ich true mit == 1 && a == 2 && a == 3 (Black Magic) ausgeben.
Ich habe versucht, eine Standardauthentifizierung mit Java durchzuführen
Java Ich habe versucht, einen einfachen Block zu brechen
Ich habe Java gemacht, um (a == 1 && a == 2 && a == 3) immer wahr zu machen
Ich möchte Java8 für jeden mit Index verwenden
Erste Schritte mit Kotlin zum Senden an Java-Entwickler
Was ich getan habe, als ich Java zu Kotlin konvertiert habe
Ich wollte Spring Boot in einem Multiprojekt gradle
Ich habe versucht, mit Java und Spring eine Funktion / einen Bildschirm für den Administrator einer Einkaufsseite zu erstellen
[Azure] Ich habe versucht, eine kostenlose Java-App zu erstellen ~ Mit FTP verbinden ~ [Anfänger]
Ich möchte es zusätzlich implementieren, während ich Kotlin auf einer Site verwende, auf der Java ausgeführt wird
Ich habe versucht, was ich mit Stream leise versuchen wollte.
Senden Sie einen Job an AWS Batch mit Java (Eclipse)
Ich habe versucht, TCP / IP + BIO mit JAVA zu implementieren
[Java 11] Ich habe versucht, Java auszuführen, ohne mit Javac zu kompilieren
Rufen Sie eine Methode mit Kotlins Rückrufblock von Java aus auf
So generieren Sie manuell ein JWT mit Knock in Rails
Ich habe versucht, eine Clova-Fähigkeit in Java zu erstellen
Ich möchte eine bestimmte Datei mit WatchService überwachen
Ich habe versucht, eine Anmeldefunktion mit Java zu erstellen
Ich habe versucht, mit OCR eine PDF-Datei mit Java zu verarbeiten
Ich habe versucht, Sterling Sort mit Java Collector zu implementieren
Ich habe nc (netcat) normalerweise mit JAVA gemacht
[Java] So unterbrechen Sie eine Zeile mit StringBuilder
Ich möchte eine Schleife schreiben, die auf einen Index mit der Stream-API von Java 8 verweist
Ich möchte mit Java8 StreamAPI redu () einen anderen Typ als das Eingabeelement zurückgeben.
Java-Programm zum Ändern der Größe eines Fotos in ein Quadrat mit Rändern
Verwendung des mit Tensorflow 2.0 trainierten Modells mit Kotlin / Java
[Java] Ich möchte ein Byte-Array in eine Hexadezimalzahl konvertieren
Ich habe versucht, die Grundlagen von Kotlin und Java zusammenzufassen
[Rails] Ich habe versucht, eine Mini-App mit FullCalendar zu erstellen
[Anfänger] Versuchen Sie, mit Java ein einfaches RPG-Spiel zu erstellen ①
Ich habe ein Plug-In erstellt, das Jextract mit Gradle-Aufgaben ausführt
[Anfänger] Ich habe ein Programm zum Verkauf von Kuchen in Java erstellt