[JAVA] J'ai fait de l'art de la mosaïque avec des images Pokemon

introduction

Dans cet article, je vais vous montrer comment créer automatiquement une mosaïque en utilisant des images de 18 Pokémon à partir de l'image d'entrée.

Préparation préalable

  1. De Pokemon Encyclopedia à 18 animaux (aqua, noir, bleu, fuchsia, argent, vert, lime, marron, marine, olive, violet, rouge, gris, Sélectionnez un Pokémon dont la couleur est proche de sarcelle, blanc, jaune, beige, orange).
  2. Après avoir ajouté la couleur d'arrière-plan à l'aide de Photoshop, etc., ajustez la taille à 40x40.
3. Mettez l'image de Pokemon dans image / ou dans un répertoire approprié.

Processus approximatif

Il y a peut-être un moyen plus intelligent, mais ...

  1. Divisez l'image d'entrée en 40x40 `` PhotoMosaic.java```
  2. Prenez la moyenne des couleurs de l'image créée dans 1 GetAverage.java``` 3.2 Réduction des couleurs basée sur la moyenne des couleurs de 2 ReduceColor.java` '' Placez le Pokémon de la couleur sélectionnée dans 4.3 PhotoMosaic.java` ``

Je vais le mettre en œuvre comme ça.

la mise en oeuvre

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 ");

		//Déclarer un tableau pour contenir l'image recadrée
		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 images originales*Couper à 40
				split_image[i][j] = before_image.getSubimage( i*40, j*40, 40, 40 );
				//Prendre la moyenne des couleurs de l'image recadrée
				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];

    //Prenez les valeurs RVB des pixels pour obtenir le total
    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();
      }
    }

    //Trouvez la valeur moyenne des pixels
    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]);
    //Un tableau pour mettre les indices du tableau d'images à convertir
    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;	//Indice du tableau
		int difference;	//Valeur du tableau-Valeur absolue de la valeur RVB v
    int[] list = {64,128,192,192};
    // System.out.println("La valeur de v est"+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];
  }

}

résultat

(Cliquez pour agrandir)

――Il était assez difficile de réduire la couleur. Surtout quand c'était bleu clair, il était jugé blanc et cela ne fonctionnait pas. ―― La couleur rouge était relativement agréable. ―― Puisqu'il n'y a que 18 couleurs, la photographie de paysage est difficile.

Articles utiles

Recommended Posts

J'ai fait de l'art de la mosaïque avec des images Pokemon
J'ai créé une interface graphique avec Swing
J'ai fait une mort risquée avec Ruby
J'ai créé une application Janken avec kotlin
J'ai créé une application Janken avec Android
04. J'ai fait un frontal avec SpringBoot + Thymeleaf
J'ai créé un robot LINE avec Rails + heroku
J'ai fait un portfolio avec Ruby On Rails
[Ruby] J'ai fait un robot avec de l'anémone et du nokogiri.
J'ai créé une application de chat.
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 1 (édition API)
J'ai créé un environnement de développement avec rails6 + docker + postgreSQL + Materialise.
J'ai créé un plug-in qui exécute jextract avec des tâches Gradle
J'ai créé un MOD qui appelle instantanément un véhicule avec Minecraft
J'ai créé une fonction pour enregistrer des images avec l'API dans Spring Framework. Partie 2 (édition client)
Pokemon Go fait avec Faker Gem
J'ai créé une application shopify @java
J'ai fait une simple fonction de recommandation.
J'ai créé une application correspondante (application Android)
J'ai créé un outil de génération package.xml.
[Android] J'ai créé une application de podomètre.
J'ai créé un formulaire de recherche simple avec Spring Boot + GitHub Search API.
[Ruby] J'ai créé un simple client Ping
J'ai créé un serveur écologique avec scala
J'ai essayé de jouer un peu avec BottomNavigationView ①
J'ai créé un plug-in pour IntelliJ IDEA
J'ai créé une application de calculatrice sur Android
J'ai créé un nouvel outil de déploiement Java
[LINE BOT] J'ai créé un Ramen BOT avec Java (Maven) + Heroku + Spring Boot (1)
J'ai créé un site qui résume les informations sur la restriction du sucre avec Vue.js
Apprendre Java avec Progate → Je vais vous expliquer parce que j'ai moi-même créé un jeu de base
J'ai créé un outil Diff pour les fichiers Java
J'ai créé un programme de jugement des nombres premiers en Java
J'ai fait un blackjack avec Ruby (j'ai essayé d'utiliser minitest)
J'ai créé un jeu Janken en Java (CLI)
J'ai créé une application de visualisation qui affiche le PDF
J'ai créé un conteneur Docker pour exécuter Maven
J'ai créé une bibliothèque d'extension Ruby en C
[Rails] J'ai créé une fonction de brouillon en utilisant enum
J'ai créé Code Pipeline avec AWS CDK.
J'ai essayé de casser le bloc avec java (1)
J'ai créé StringUtils.isBlank
J'ai essayé de déployer une page créée avec l'antique Middleman sur Azure Static Web Apps
J'ai créé un schéma de verrouillage à l'aide de la touche de volume avec l'application Android. Édition fragmentée
J'ai fait un jeu de problèmes de calcul simple en Java
J'ai fait une méthode pour demander la prime vendredi
J'ai fait un chat de dessin "chat de peinture 8 bits" avec WebAssembly
Je souhaite surveiller un fichier spécifique avec WatchService
J'ai créé un serveur et un client Restful au printemps.
J'ai créé une bibliothèque qui fonctionne comme un onglet dans Safari !!
J'ai essayé OCR de traiter un fichier PDF avec Java
[Débutant] Je suis tombé sur le lancement d'un projet avec Rails6
J'ai créé une bibliothèque pour afficher des tutoriels sur Android.
J'ai créé un Wrapper qui appelle KNP depuis Java
J'ai créé une application Android qui GET avec HTTP