今からはじめるプログラミング37
なかなか自分でも何をしているのか、お金儲けしたい!
どうも守銭奴のライン工です。
まぁ儲けてはいないのですが。。。。
いろいろ画像のプログラム作ってきたけれど、やっとここれならいけるんじゃね?
と思う。ようなものが作れました。
サンプルプログラムが、なんだか私利私欲に塗れていきますw
今回は画面は作ってません。
線や四角やマルを描画するメソッドをひたすら呼び出して、なんとかギター(弦楽器が好きです。)の形をしたゆるい画像を作ることに成功?
あとは、重複しないようにするにはどうすればいいか?
とりあえず、ここでは「色」を重複しないようにしました。
ただ、リストに突っ込んで存在確認しているだけなので、おかしい気もします。
(というかおかしいです。絶対。)
まぁそんなプログラムです。
-----------------------------------------------------------
package sample20;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Polygon;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
import javax.imageio.ImageIO;
import sample18.CreateFace;
/**
* ギターアイコン作成
*
* @author ma
*/
public class CreateIcon {
//private Color usedColors new ;
private ArrayList<Color> usedColorList = new ArrayList<Color>();
/***** 画像のサイズ(幅) **/
private int sizeX = 800;
/***** 画像のサイズ(高さ) **/
private int sizeY = 800;
private Color baseColor = null;
/**
* にわか重複なしカラー返却
*
* @return Color
***/
private Color getRndClr() {
int size = this.usedColorList.size();
boolean exists = false;
Random r = new Random();
int red = r.nextInt(255);
int green = r.nextInt(255);
int blue = r.nextInt(255);
Color color = new Color(red, green, blue);
for (int i = 0; i < size; i++) {
Color colorInList = (Color) this.usedColorList.get(i);
if (color.equals(colorInList)) {
exists = true;
}
}
if (!exists) {
this.usedColorList.add(color);
return color;
}
return null;
}
/**
* サイズを設定する
*
* @param x
* @param y
*/
public void setSize(int x, int y) {
this.sizeX = x;
this.sizeY = y;
}
/**
* サイズ変更
*/
public BufferedImage reSize(BufferedImage resize, int sizeX, int sizeY) {
// 指定のサイズに拡大縮小
// 書き出し先の枠作成
BufferedImage resized = new BufferedImage(sizeX, sizeY, BufferedImage.TYPE_INT_ARGB);
// 書き出し先に合わせてイメージサイズを変更
resized.createGraphics().drawImage(resize.getScaledInstance(sizeX, sizeY, Image.SCALE_AREA_AVERAGING), 0, 0,
sizeX, sizeY, null);
try {
// 確認用一時ファイル
ImageIO.write(resized, "png", new File("./tmp.png"));
} catch (IOException e) {
e.printStackTrace();
}
return resized;
}
/**
* コンストラクタ
*/
public CreateIcon() {
init();
}
/**
* 出力 image 画像 name ファイル名 extension 画像の種類(png/jpeg)
*/
public void output(BufferedImage image, String name, String extension) {
// 出力
try {
ImageIO.write(image, extension, new File("./" + name));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/***
* 背景
****/
private void createBackGround(BufferedImage image) {
Graphics2D g2d = image.createGraphics();
// 色を設定
g2d.setColor(getRndClr());
// 四角で塗りつぶす
g2d.fillRect(0, 0, this.sizeX, this.sizeY);
}
private void setBaseColor() {
baseColor = this.getRndClr();
}
private void drawBoldLine(Graphics2D g2d, int x, int y, int x2, int y2) {
int pX = x + 1;
int pY = y + 1;
int mX = x - 1;
int mY = y - 1;
int pX2 = x2 + 1;
int pY2 = y2 + 1;
int mX2 = x2 - 1;
int mY2 = y2 - 1;
g2d.drawLine(x, y, x2, y2);
g2d.drawLine(pX, pY, pX2, pY2);
g2d.drawLine(mX, mY, mX2, mY2);
}
/***
* ヘッド作成
****/
private void createHead(BufferedImage image) {
// ヘッド作成
Graphics2D g2d = image.createGraphics();
// 色を設定
g2d.setColor(this.baseColor);
int xpoints = { 186, 228, 215, 188 };
int ypoints = { 49, 45, 107, 109 };
Polygon polygon = new Polygon(xpoints, ypoints, xpoints.length);
g2d.fill(polygon);
g2d.setColor(this.getRndClr());
drawBoldLine(g2d, 186, 49, 228, 45);
drawBoldLine(g2d, 228, 45, 215, 107);
drawBoldLine(g2d, 215, 107, 188, 109);
drawBoldLine(g2d, 188, 109, 186, 49);
// peg
g2d.setColor(Color.LIGHT_GRAY);
drawBoldLine(g2d, 185, 168, 186, 169);
drawBoldLine(g2d, 230, 65, 231, 66);
drawBoldLine(g2d, 182, 183, 183, 184);
drawBoldLine(g2d, 182, 97, 183, 98);
drawBoldLine(g2d, 221, 83, 222, 84);
drawBoldLine(g2d, 222, 94, 223, 95);
}
private void createNeck(BufferedImage image) {
Graphics2D g2d = image.createGraphics();
// 色を設定
g2d.setColor(this.baseColor);
//
int xpoints = { 185, 217, 219, 184 };
int ypoints = { 109, 112, 321, 320 };
Polygon polygon = new Polygon(xpoints, ypoints, xpoints.length);
g2d.fill(polygon);
g2d.setColor(this.getRndClr());
drawBoldLine(g2d, 185, 109, 217, 112);
drawBoldLine(g2d, 217, 112, 219, 321);
drawBoldLine(g2d, 219, 321, 184, 320);
drawBoldLine(g2d, 184, 320, 185, 109);
// TODO FLET
}
private void createBody(BufferedImage image) {
// TODO
Graphics2D g2d = image.createGraphics();
// 色を設定
g2d.setColor(this.getRndClr());
// わく
g2d.drawOval(120, 274, 200, 200);
g2d.drawOval(100, 371, 230, 230);
g2d.drawOval(119, 274, 201, 201);
g2d.drawOval(99, 371, 231, 231);
// ぬりつぶし
g2d.setColor(this.baseColor);
g2d.fillOval(120, 274, 200, 200);
g2d.fillOval(100, 371, 230, 230);
// Sound hole
g2d.setColor(Color.BLACK);
g2d.fillOval(150, 310, 80, 80);
// Bridge
g2d.setColor(Color.LIGHT_GRAY);
g2d.fillRect(166, 450, 80, 20);
// String
g2d.setColor(Color.YELLOW);
g2d.drawLine(185, 110, 185, 450);
g2d.drawLine(189, 110, 189, 450);
g2d.drawLine(193, 110, 193, 450);
g2d.drawLine(197, 110, 197, 450);
g2d.drawLine(201, 110, 201, 450);
g2d.drawLine(204, 110, 204, 450);
//
g2d.drawLine(185, 110, 185, 60);
g2d.drawLine(189, 110, 190, 75);
g2d.drawLine(193, 110, 195, 90);
g2d.drawLine(197, 110, 200, 90);
g2d.drawLine(201, 110, 205, 75);
g2d.drawLine(205, 110, 210, 60);
}
/**
* 作成
*/
public BufferedImage create() {
// 初期イメージ作成
BufferedImage img = new BufferedImage(this.sizeX, this.sizeY, BufferedImage.TYPE_INT_ARGB);
// 画像の統一感をだすためにベースカラーは同じになるように考えているけれ
this.setBaseColor();
this.createBackGround(img);
this.createHead(img);
this.createNeck(img);
this.createBody(img);
return img;
}
/**
* 初期処理s
*/
private void init() {
}
public static void main(String args) {
CreateIcon crt = new CreateIcon();
crt.setSize(600, 600);
BufferedImage img = crt.create();
crt.reSize(img, 480, 480);
crt.output(img, "guiter_out.png", "png");
//TODO バッチ
long startTm = System.currentTimeMillis(); //時間計測
//数値に変換
int num =1000;
//ファイルに上書きされても意味がないのでループした回数みたいなのをファイル名につけて一意にする
String fileName = "./guiter_out.png";
File defltFile = new File(fileName);
//if文意味がないかも
if(defltFile.exists()) {
//画面の回数分ファイル名を変えながら顔作成を実行
for(int i =0;i<num;i++) {
String newFileName = i + "_"+ defltFile.getName();
defltFile.renameTo(new File("./"+newFileName));
img = crt.create();
crt.reSize(img, 480, 480);
crt.output(img, newFileName, "png");
}
}
long endTm = System.currentTimeMillis(); //時間計測
long execTm = endTm-startTm;
System.out.println("exec batch time:"+execTm+"ms"); //処理時間
}
}
-----------------------------------------------------------
1000個生成するのに、1分ほどかかりました。
グーグルドライブは以下です。
https://drive.google.com/file/d/1aYDhNZZ1u-kd-ytr52ZbkEgtAWjQTbGu/view?usp=sharing
寝ぼけて作っているので、直しは勘弁してくださいw