[JAVA] Ich habe Mosaikkunst mit Pokemon-Bildern gemacht

Einführung

In diesem Artikel werde ich vorstellen, wie automatisch Mosaikkunst mit Bildern von 18 Pokémon aus dem Eingabebild erstellt wird.

Vorbereitungen

  1. Von Pokemon Encyclopedia bis 18 Tiere (Aqua, Schwarz, Blau, Fuchsia, Silber, Grün, Limette, Kastanienbraun, Marine, Olive, Lila, Rot, Grau, Wähle ein Pokémon aus, dessen Farbe fast blaugrün, weiß, gelb, beige, orange ist.
  2. Nachdem Sie die Hintergrundfarbe mit Photoshop usw. hinzugefügt haben, stellen Sie die Größe auf 40 x 40 ein.
3. Legen Sie das Bild von Pokemon in ein Bild / oder ein entsprechendes Verzeichnis.

Grober Verarbeitungsfluss

Es mag einen klügeren Weg geben, aber ...

  1. Teilen Sie das Eingabebild in 40x40 `` `PhotoMosaic.java```
  2. Nehmen Sie den Farbmittelwert des in 1 `GetAverage.java``` erstellten Bildes 3.2 Farbreduzierung basierend auf dem Farbdurchschnitt von 2 ReduceColor.java`` Platziere das Pokémon der in 4.3 `PhotoMosaic.java `ausgewählten Farbe

Ich werde es so umsetzen.

Implementierung

PhotoMosaic.java


import java.awt.image.*;
import java.awt.Graphics;

public class PhotoMosaic {

	static BufferedImage execute(BufferedImage before_image) {
		int width = before_image.getWidth();
		int height = before_image.getHeight();
		BufferedImage after_image = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
		Graphics g = after_image.getGraphics();
		BufferedImage image[] = new BufferedImage[18];
        image[0] = JpegFileReader.read("image/white.png ");
        image[1] = JpegFileReader.read("image/fuchsia.png ");
        image[2] = JpegFileReader.read("image/lime.png ");
        image[3] = JpegFileReader.read("image/blue.png ");
        image[4] = JpegFileReader.read("image/black.png ");
        image[5] = JpegFileReader.read("image/maroon.png ");
        image[6] = JpegFileReader.read("image/olive.png ");
		image[7] = JpegFileReader.read("image/silver.png ");
		image[8] = JpegFileReader.read("image/red.png ");
		image[9] = JpegFileReader.read("image/green.png ");
		image[10] = JpegFileReader.read("image/navy.png ");
		image[11] = JpegFileReader.read("image/yellow.png ");
		image[12] = JpegFileReader.read("image/aqua.png ");
		image[13] = JpegFileReader.read("image/gray.png ");
		image[14] = JpegFileReader.read("image/purple.png ");
		image[15] = JpegFileReader.read("image/teal.png ");
		image[16] = JpegFileReader.read("image/beige.png ");
		image[17] = JpegFileReader.read("image/orange.png ");

		//Deklarieren Sie ein Array für das zugeschnittene Bild
		BufferedImage[][] split_image = new BufferedImage[width/40][height/40];

		for ( int i=0; i*40<width; i++ ) {
			for ( int j=0; j*40<height; j++ ) {
				//40 Originalbilder*Schnitt auf 40
				split_image[i][j] = before_image.getSubimage( i*40, j*40, 40, 40 );
				//Nehmen Sie den Farbdurchschnitt des zugeschnittenen Bildes
				int color_num = ReduceColor.detectColor(GetAverage.execute(split_image[i][j]));
				g.drawImage(image[color_num], i*40, j*40, null);
			}
		}
		g.dispose();
		return after_image;
  }

}

GetAverage.java


import java.awt.image.*;
import java.awt.Color;

public class GetAverage{
  static int[] execute(BufferedImage image){
    int R = 0, G = 0, B = 0;
    // Average[0]->Red, Average[1]->Green, Average[2]->Blue
    int Average[] = new int[3];

    //Nehmen Sie die RGB-Werte der Pixel, um die Summe zu erhalten
    for (int i=0; i<40; i++ ) {
      for (int j=0; j<40; j++ ) {
        int tmp_color = image.getRGB(i,j);
        Color color = new Color(tmp_color);
        R += color.getRed();
        G += color.getGreen();
        B += color.getBlue();
      }
    }

    //Finden Sie den Durchschnittswert der Pixel
    Average[0] = (int)R/1600;
    Average[1] = (int)G/1600;
    Average[2] = (int)B/1600;
    return Average;
  }
}

ReduceColor.java


public class ReduceColor{

  static int detectColor(int[] Average){
    int R = getNearestValue(Average[0]);
    int G = getNearestValue(Average[1]);
    int B = getNearestValue(Average[2]);
    //Ein Array zum Einfügen der Indizes des zu konvertierenden Array von Bildern
    int[][][] v = new int[256][256][256];
    
    v[64][64][64] = 4;    // black
    v[64][64][128] = 10;  // navy
    v[64][64][192] = 3;   // blue
    v[64][64][255] = 3;   // blue

    v[64][128][64] = 9;   // green
    v[64][128][128] = 15; // teal
    v[64][128][192] = 15; // teal
    v[64][128][255] = 3;  // blue

    v[64][192][64] = 2;   // lime
    v[64][192][128] = 15; // teal
    v[64][192][192] = 12; // aqua
    v[64][192][255] = 3;  // blue

    v[64][255][64] = 2;   // lime
    v[64][255][128] = 2;  // lime
    v[64][255][192] = 12; // aqua
    v[64][255][255] = 12; // aqua

    v[128][64][64] = 5;   // maroon
    v[128][64][128] = 14; // purple
    v[128][64][192] = 14; // purple
    v[128][64][255] = 3;  // blue

    v[128][128][64] = 6;  // olive
    v[128][128][128] = 13;// gray
    v[128][128][192] = 3; // blue
    v[128][128][255] = 3; // blue

    v[128][192][64] = 9;  // green
    v[128][192][128] = 2; // lime
    v[128][192][192] = 12;// aqua
    v[128][192][255] = 12;// aqua

    v[128][255][64] = 2;  // lime
    v[128][255][128] = 2; // lime
    v[128][255][192] = 2; // lime
    v[128][255][255] = 12;// aqua

    v[192][64][64] = 8;   // red
    v[192][64][128] = 1;  // fuchsia
    v[192][64][192] = 1;  // fuchsia
    v[192][64][255] = 14; // purple

    v[192][128][64] = 17; // orange
    v[192][128][128] = 16;// beige
    v[192][128][192] = 1; // fuchsia
    v[192][128][255] = 1; // fuchsia

    v[192][192][64] = 11;  // yellow
    v[192][192][128] = 11; // yellow
    v[192][192][192] = 0; // white
    v[192][192][255] = 12;// aqua

    v[192][255][64] = 12; // aqua
    v[192][255][128] = 2; // lime
    v[192][255][192] = 0; // white
    v[192][255][255] = 12;// aqua

    v[255][64][64] = 8;   // red
    v[255][64][128] = 8;  // red
    v[255][64][192] = 1;  // fuchsia
    v[255][64][255] = 1;  // fuchsia

    v[255][128][64] = 17; // orange
    v[255][128][128] = 16;// beige
    v[255][128][192] = 1; // fuchsia
    v[255][128][255] = 1; // fuchsia

    v[255][192][64] = 11; // yellow
    v[255][192][128] = 11;// yellow
    v[255][192][192] = 16;// beige
    v[255][192][255] = 16;// beige

    v[255][255][64] = 11; // yellow
    v[255][255][128] = 11;// yellow
    v[255][255][192] = 0; // white
    v[255][255][255] = 0; // white

    return v[R][G][B];
  }

  public static int getNearestValue(int v){
		int num=0;	//Array-Index
		int difference;	//Array-Wert-Absolutwert des RGB-Wertes v
    int[] list = {64,128,192,192};
    // System.out.println("Der Wert von v ist"+v);
		difference = Math.abs( list[0] - v );
		for ( int i = 1; i < list.length; i++ ) {
			if ( Math.abs( list[i] - v ) < difference ) {
				num = i;
				difference = Math.abs( list[i] - v );
			}
		}
 		return list[num];
  }

}

Ergebnis

(Klicken um zu vergrößern)

――Es war ziemlich schwierig, die Farbe zu reduzieren. Besonders wenn es hellblau war, wurde es als weiß beurteilt und es funktionierte nicht. ――Die rote Farbe war relativ schön. ――Da es nur 18 Farben gibt, ist Landschaftsfotografie schwierig.

Hilfreiche Artikel

Recommended Posts

Ich habe Mosaikkunst mit Pokemon-Bildern gemacht
Ich habe mit Swing eine GUI erstellt
Ich habe mit Ruby einen riskanten Würfel gemacht
Ich habe eine Janken App mit Kotlin gemacht
Ich habe eine Janken App mit Android gemacht
04. Ich habe mit SpringBoot + Thymeleaf ein Frontend gemacht
Ich habe einen LINE Bot mit Rails + Heroku gemacht
Ich habe mit Ruby On Rails ein Portfolio erstellt
[Ruby] Ich habe einen Crawler mit Anemone und Nokogiri gemacht.
Ich habe eine Chat-App erstellt.
Ich habe eine Funktion zum Registrieren von Bildern bei der API in Spring Framework erstellt. Teil 1 (API Edition)
Ich habe eine Entwicklungsumgebung mit Rails6 + Docker + PostgreSQL + Materialise erstellt.
Ich habe ein Plug-In erstellt, das Jextract mit Gradle-Aufgaben ausführt
Ich habe einen MOD erstellt, der sofort ein Fahrzeug mit Minecraft anruft
Ich habe eine Funktion zum Registrieren von Bildern bei der API in Spring Framework erstellt. Teil 2 (Client Edition)
Pokemon Go gemacht mit Faker Gem
Ich habe eine shopify App @java erstellt
Ich habe eine einfache Empfehlungsfunktion erstellt.
Ich habe eine passende App erstellt (Android App)
Ich habe ein Tool zur Generierung von package.xml erstellt.
[Android] Ich habe eine Schrittzähler-App erstellt.
Ich habe ein einfaches Suchformular mit Spring Boot + GitHub Search API erstellt.
[Ruby] Ich habe einen einfachen Ping-Client erstellt
Ich habe einen Öko-Server mit Scala gemacht
Ich habe versucht, ein wenig mit BottomNavigationView zu spielen ①
Ich habe ein Plug-In für IntelliJ IDEA erstellt
Ich habe eine Taschenrechner-App für Android erstellt
Ich habe ein neues Java-Bereitstellungstool erstellt
[LINE BOT] Ich habe einen Ramen BOT mit Java (Maven) + Heroku + Spring Boot (1) gemacht.
Ich habe mit Vue.js eine Seite erstellt, die Informationen zur Zuckereinschränkung zusammenfasst
Lerne Java mit Progate → Ich werde es erklären, weil ich selbst ein einfaches Spiel gemacht habe
Ich habe ein Diff-Tool für Java-Dateien erstellt
Ich habe ein Programm zur Beurteilung von Primzahlen in Java erstellt
Ich habe mit Ruby einen Blackjack gemacht (ich habe versucht, Minitest zu verwenden)
Ich habe ein Janken-Spiel in Java (CLI) gemacht.
Ich habe eine Viewer-App erstellt, die PDF anzeigt
Ich habe einen Docker-Container erstellt, um Maven auszuführen
Ich habe eine Ruby-Erweiterungsbibliothek in C erstellt
[Rails] Ich habe eine Entwurfsfunktion mit enum erstellt
Ich habe Code Pipeline mit AWS CDK erstellt.
Ich habe versucht, den Block mit Java zu brechen (1)
Ich habe StringUtils.isBlank gemacht
Ich habe versucht, eine mit antikem Middleman erstellte Seite in Azure Static Web Apps bereitzustellen
Ich habe mit der Lautstärketaste mit der Android-App ein Sperrmuster erstellt. Fragment Edition
Ich habe ein einfaches Berechnungsproblemspiel in Java gemacht
Ich habe eine Methode entwickelt, um nach Premium Friday zu fragen
Ich habe mit WebAssembly einen Zeichnungschat "8bit Paint Chat" erstellt
Ich möchte eine bestimmte Datei mit WatchService überwachen
Ich habe im Frühjahr einen Restful-Server und -Client erstellt.
Ich habe eine Bibliothek erstellt, die in Safari wie ein Tab funktioniert !!
Ich habe versucht, mit OCR eine PDF-Datei mit Java zu verarbeiten
[Anfänger] Ich bin auf ein Projekt mit Rails6 gestoßen
Ich habe eine Bibliothek zum Anzeigen von Tutorials auf Android erstellt.
Ich habe einen Wrapper erstellt, der KNP von Java aus aufruft
Ich habe eine Android-App erstellt, die mit HTTP abgerufen wird