今からはじめるプログラミング34

前回の前回、

今からはじめるプログラミング32 - yo2an’s blog

で画像をランダムに表示する、というプログラムを作りましたが、

起動するたびに、変わるというのは、すこしわかりずらいなぁ。。。

と作ってから思ったので、

今現在、ちょっとシュールなプログラムを作っています。

まだ途中なのですが、メインの画像処理部分はできたので、アップップです。

CreateFace

-------------------------------------------------------------

package sample18;

 

import java.awt.Color;

import java.awt.Image;

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;

 

/**

* かおさくせい

* @author ma

*

*/

public class CreateFace {

 

private File backs = null;

private File heads = null;

private File items = null;

private File lefts = null;

private File mouths = null;

private File noses = null;

private File rights = null;

private BufferedImage resized = null;

 

public CreateFace() {

init();

create();

output();

}

 

public CreateFace(String text) {

// TODO Auto-generated constructor stub

}

 

/**

* 出力

*/

private void output() {

// 出力

try {

ImageIO.write(resized, "png", new File("./resize_out.png"));

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

 

/**

*

* @param read  参照する画像

* @param alpha 透明にしたい色

* @return readのalphaを透明色にして返す

* @see http://blog.livedoor.jp/tct_web_dev/archives/8999950.html

*/

public BufferedImage getAlphaImage(BufferedImage read, Color alpha) {

int w = read.getWidth(), h = read.getHeight();// 元画像(read)の縦横の値を取得

 

// 書込用にwriteを宣言

BufferedImage write = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB);

 

for (int y = 0; y < h; y++) {

for (int x = 0; x < w; x++) {

if (read.getRGB(x, y) == alpha.getRGB()) {// readの特定位置においてalphaと同色であるなら

write.setRGB(x, y, 0);// writeの同じ位置の色を透過色として書き込む

} else {// それ以外はreadのコピー

write.setRGB(x, y, read.getRGB(x, y));

}

}

}

 

return write;// alphaを透明色にしたwriteを返す

}

 

 

/**

* 作成

*/

private void create() {

// TODO Auto-generated method stub

 

int cnt = backs.length;

Random r = new Random();

BufferedImage img = null;

try {

// 背景を読み込む

img = ImageIO.read(backs[r.nextInt(cnt)]);

// 背景をいったん拡大

resized = new BufferedImage(500, 500, BufferedImage.TYPE_INT_ARGB);

resized = getAlphaImage(resized, Color.WHITE);

 

// 拡大画像に背景を書き込む

resized.createGraphics().drawImage(

img.getScaledInstance(

ParametersMap.getInstance().getInt(ParametersMap.KEY_DEFLT_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_DEFLT_HIT),

Image.SCALE_AREA_AVERAGING),

ParametersMap.getInstance().getInt(ParametersMap.KEY_DEFLT_X),

ParametersMap.getInstance().getInt(ParametersMap.KEY_DEFLT_Y),

ParametersMap.getInstance().getInt(ParametersMap.KEY_DEFLT_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_DEFLT_HIT), null);

 

// あたまのよみこみ

cnt = heads.length;

img = ImageIO.read(heads[r.nextInt(cnt)]);

img = getAlphaImage(img, Color.WHITE);

// 頭の書き出し

resized.createGraphics()

.drawImage(img.getScaledInstance(

ParametersMap.getInstance().getInt(ParametersMap.KEY_HEAD_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_HEAD_HIT),

Image.SCALE_AREA_AVERAGING),

ParametersMap.getInstance().getInt(ParametersMap.KEY_HEAD_X),

ParametersMap.getInstance().getInt(ParametersMap.KEY_HEAD_Y),

ParametersMap.getInstance().getInt(ParametersMap.KEY_HEAD_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_HEAD_HIT), null);

img = null;

// 左目のよみこみ

cnt = lefts.length;

img = ImageIO.read(lefts[r.nextInt(cnt)]);

img = getAlphaImage(img, Color.WHITE);

// 左目の書き出し

resized.createGraphics().drawImage(img.getScaledInstance(

ParametersMap.getInstance().getInt(ParametersMap.KEY_LFTE_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_LFTE_HIT),

Image.SCALE_AREA_AVERAGING),

ParametersMap.getInstance().getInt(ParametersMap.KEY_LFTE_X),

ParametersMap.getInstance().getInt(ParametersMap.KEY_LFTE_Y),

ParametersMap.getInstance().getInt(ParametersMap.KEY_LFTE_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_LFTE_HIT), null);

 

 

// 右目のよみこみ

cnt = rights.length;

img = ImageIO.read(rights[r.nextInt(cnt)]);

img = getAlphaImage(img, Color.WHITE);

// 右目の書き出し

resized.createGraphics().drawImage(img.getScaledInstance(

ParametersMap.getInstance().getInt(ParametersMap.KEY_RHTE_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_RHTE_HIT),

Image.SCALE_AREA_AVERAGING),

ParametersMap.getInstance().getInt(ParametersMap.KEY_RHTE_X),

ParametersMap.getInstance().getInt(ParametersMap.KEY_RHTE_Y),

ParametersMap.getInstance().getInt(ParametersMap.KEY_RHTE_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_RHTE_HIT), null);

 

// はなのよみこみ

cnt = noses.length;

img = ImageIO.read(noses[r.nextInt(cnt)]);

img = getAlphaImage(img, Color.WHITE);

// はなの書き出し

resized.createGraphics().drawImage(img.getScaledInstance(

ParametersMap.getInstance().getInt(ParametersMap.KEY_NOSE_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_NOSE_HIT),

Image.SCALE_AREA_AVERAGING),

ParametersMap.getInstance().getInt(ParametersMap.KEY_NOSE_X),

ParametersMap.getInstance().getInt(ParametersMap.KEY_NOSE_Y),

ParametersMap.getInstance().getInt(ParametersMap.KEY_NOSE_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_NOSE_HIT), null);

 

// 口のよみこみ

cnt = mouths.length;

img = ImageIO.read(mouths[r.nextInt(cnt)]);

img = getAlphaImage(img, Color.WHITE);

// 口の書き出し

resized.createGraphics().drawImage(img.getScaledInstance(

ParametersMap.getInstance().getInt(ParametersMap.KEY_MOTH_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_MOTH_HIT),

Image.SCALE_AREA_AVERAGING),

ParametersMap.getInstance().getInt(ParametersMap.KEY_MOTH_X),

ParametersMap.getInstance().getInt(ParametersMap.KEY_MOTH_Y),

ParametersMap.getInstance().getInt(ParametersMap.KEY_MOTH_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_MOTH_HIT), null);

 

// あいてむのよみこみ

cnt = items.length;

img = ImageIO.read(items[r.nextInt(cnt)]);

img = getAlphaImage(img, Color.WHITE);

// あいてむの書き出し

resized.createGraphics().drawImage(img.getScaledInstance(

ParametersMap.getInstance().getInt(ParametersMap.KEY_ITEM_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_ITEM_HIT),

Image.SCALE_AREA_AVERAGING),

ParametersMap.getInstance().getInt(ParametersMap.KEY_ITEM_X),

ParametersMap.getInstance().getInt(ParametersMap.KEY_ITEM_Y),

ParametersMap.getInstance().getInt(ParametersMap.KEY_ITEM_WID),

ParametersMap.getInstance().getInt(ParametersMap.KEY_ITEM_HIT), null);

 

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

}

 

/**

* 初期処理s

*/

private void init() {

File resource = new File("./res");

if (resource.exists()) {

// File files = resource.listFiles();

File back = new File("./res/back");

File head = new File("./res/head");

File item = new File("./res/item");

File left = new File("./res/left");

File mouth = new File("./res/mouth");

File nose = new File("./res/nose");

File right = new File("./res/right");

 

this.backs = extractPNG(back);

this.heads = extractPNG(head);

this.items = extractPNG(item);

this.lefts = extractPNG(left);

this.mouths = extractPNG(mouth);

this.noses = extractPNG(nose);

this.rights = extractPNG(right);

 

} else {

System.out.println("no resources!!!");

}

 

}

/**

* ファイル(フォルダ)のりすとから<BR>

* pngファイルの配列をつくる

* @param file resource folder

* @return File png files

*/

private File extractPNG(File file) {

int cntPng = 0;

ArrayList<File> pngLst = new ArrayList<File>();

File resource = file.listFiles();

for(int i=0;i<resource.length;i++) {

int idxPng = resource[i].getName().indexOf(".png");

 

if(idxPng>0) {

cntPng++;

pngLst.add(resource[i]);

}

}

File retn = new File[cntPng];

for(int i=0;i<cntPng;i++) {

retn[i] = pngLst.get(i);

}

 

return retn;

}

 

 

public static void main(String[] args) {

new CreateFace();

}

}

 

------------------------------------------------

結構長いですね。

あと定数みたいなものを持っているクラスです。

ParametersMap

------------------------------------------------

package sample18;

 

import java.util.HashMap;

 

/**

* パラメータ化したい変数

* TODO あとで外部ファイルに保存したりするLOAD/SAVE

* @author ma

*

*/

public class ParametersMap {

 

private HashMap<String,String> map = null;

 

private static ParametersMap paramap = null;

 

public static final String KEY_FILE_NAME = "KEY_FILE_NAME";

public static final String KEY_FILE_PATH = "KEY_FILE_PATH";

public static final String KEY_FB_HIT = "KEY_FB_HIT";

public static final String KEY_FB_WID = "KEY_FB_WID";

public static final String KEY_TWT_HIT = "KEY_TWT_HIT";

public static final String KEY_TWT_WID = "KEY_TWT_WID";

public static final String KEY_LN_HIT = "KEY_LN_HIT";

public static final String KEY_LN_WID = "KEY_LN_WID";

 

public static final String KEY_DEFLT_X = "KEY_DEFLT_X";

public static final String KEY_DEFLT_Y = "KEY_DEFLT_Y";

public static final String KEY_DEFLT_HIT = "KEY_DEFLT_HIT";

public static final String KEY_DEFLT_WID = "KEY_DEFLT_WID";

 

public static final String KEY_HEAD_X = "KEY_HEAD_X";

public static final String KEY_HEAD_Y = "KEY_HEAD_Y";

public static final String KEY_HEAD_HIT = "KEY_HEAD_HIT";

public static final String KEY_HEAD_WID = "KEY_HEAD_WID";

//ひだりめ

public static final String KEY_LFTE_X = "KEY_LFTE_X";

public static final String KEY_LFTE_Y = "KEY_LFTE_Y";

public static final String KEY_LFTE_HIT = "KEY_LFTE_HIT";

public static final String KEY_LFTE_WID = "KEY_LFTE_WID";

//みぎめ

public static final String KEY_RHTE_X = "KEY_RHTE_X";

public static final String KEY_RHTE_Y = "KEY_RHTE_Y";

public static final String KEY_RHTE_HIT = "KEY_RHTE_HIT";

public static final String KEY_RHTE_WID = "KEY_RHTE_WID";

//はな

public static final String KEY_NOSE_X = "KEY_NOSE_X";

public static final String KEY_NOSE_Y = "KEY_NOSE_Y";

public static final String KEY_NOSE_HIT = "KEY_NOSE_HIT";

public static final String KEY_NOSE_WID = "KEY_NOSE_WID";

//くち

public static final String KEY_MOTH_X = "KEY_MOTH_X";

public static final String KEY_MOTH_Y = "KEY_MOTH_Y";

public static final String KEY_MOTH_HIT = "KEY_MOTH_HIT";

public static final String KEY_MOTH_WID = "KEY_MOTH_WID";

//あいてむえふぇくと

public static final String KEY_ITEM_X = "KEY_ITEM_X";

public static final String KEY_ITEM_Y = "KEY_ITEM_Y";

public static final String KEY_ITEM_HIT = "KEY_ITEM_HIT";

public static final String KEY_ITEM_WID = "KEY_ITEM_WID";

//TODO 回転率

//TODO ぶれ率

 

 

public int getInt(String key) {

 

String strVal = this.map.get(key);

 

return Integer.parseInt(strVal);

 

}

 

private ParametersMap() {

map = new HashMap<String,String>();

 

map.put(KEY_DEFLT_X,"0");

map.put(KEY_DEFLT_Y,"0");

map.put(KEY_DEFLT_HIT,"500");

map.put(KEY_DEFLT_WID,"500");

 

map.put(KEY_HEAD_X,"0");

map.put(KEY_HEAD_Y,"0");

map.put(KEY_HEAD_HIT,"300");

map.put(KEY_HEAD_WID,"500");

 

map.put(KEY_LFTE_X,"100");

map.put(KEY_LFTE_Y,"200");

map.put(KEY_LFTE_HIT,"100");

map.put(KEY_LFTE_WID,"100");

 

map.put(KEY_RHTE_X,"275");

map.put(KEY_RHTE_Y,"200");

map.put(KEY_RHTE_HIT,"100");

map.put(KEY_RHTE_WID,"100");

 

map.put(KEY_NOSE_X,"200");

map.put(KEY_NOSE_Y,"250");

map.put(KEY_NOSE_HIT,"100");

map.put(KEY_NOSE_WID,"100");

 

map.put(KEY_MOTH_X,"200");

map.put(KEY_MOTH_Y,"325");

map.put(KEY_MOTH_HIT,"100");

map.put(KEY_MOTH_WID,"100");

 

map.put(KEY_ITEM_X,"0");

map.put(KEY_ITEM_Y,"0");

map.put(KEY_ITEM_HIT,"500");

map.put(KEY_ITEM_WID,"500");

 

map.put(KEY_FB_HIT,"480");

map.put(KEY_FB_WID,"480");

map.put(KEY_TWT_HIT,"480");

map.put(KEY_TWT_WID,"480");

map.put(KEY_LN_HIT,"480");

map.put(KEY_LN_WID,"480");

map.put(KEY_FILE_NAME,"./resize_out.png");

map.put(KEY_FILE_PATH,"./out");

 

 

}

 

public static ParametersMap getInstance() {

if (paramap == null) {

paramap = new ParametersMap();

}

return paramap;

}

 

}

----------------------------------------------

プログラムだけ、眺めるとあまり意味不明かも知れないです。

リソースとなる画像を用意しないといけないのですが、

実行結果(w)

f:id:yo2an:20210814183916p:plain

実行結果

 

こんなのができました。

現状のプロジェクトのファイルです。

sample18.zip - Google ドライブ

あまぞんで新エヴァやってますね!

https://amzn.to/2Ufo7Ro