今からはじめるプログラミング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.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)
こんなのができました。
現状のプロジェクトのファイルです。
あまぞんで新エヴァやってますね!