今からはじめるプログラミング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