In diesem Artikel werde ich vorstellen, wie automatisch Mosaikkunst mit Bildern von 18 Pokémon aus dem Eingabebild erstellt wird.
Es mag einen klügeren Weg geben, aber ...
`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 FarbeIch werde es so umsetzen.
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];
}
}
(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.
Recommended Posts