###どういうプログラムを書いたか
processingでディレクトリ内の画像を読み込み、色の平均値を求め、その値を3d空間に点で表示し、指定した範囲内にある点に当たる画像を保存する、というプログラムを作りました。
###発生している問題
読み込める画像の枚数が最大6枚となっている。
###実行したソースコード(とても読みにくく申し訳ございません)
/selectFolderやloadImagesという関数の内容に問題があるはず/
ArrayList<PImage> images = new ArrayList<PImage>();
String[] extensions = {
".jpg",".gif",".tga",".png","JPG"
};
PVector[] ps = new PVector[0];
int a,b,c,r;
void setup() {
a=450;b=450;c=450;r=450;
size(750,300,P3D);
smooth(6);
noStroke();
selectFolder("フォルダの選択","loadImages");
//selectFolderで選んだファイルはloadImagesという関数で処理される
}
void draw() {
background(255);
fill(22,24,37);
rect(435,0,750-435,300);
rect(400,0,10,300);
fill(225,107,140);
rect(450,30,255,20);
rect(450,60,255,20);
rect(450,90,255,20);
rect(450,120,255,20);
rect(450,90,255,20);
sys();//操作画面の表示及び画像の保存
db();//3d空間の枠、選択範囲の球を描く
for(int i=0;i<ps.length;i++){
//空間内に画像の色の平均値のrgb値をxyz空間に点を置く形で表す
points(ps[i].x,ps[i].y,ps[i].z);
}
}
void loadImages(File selection){
File[] files = selection.listFiles();
for(int i = 0; i < files.length; i++){
for(String extension : extensions){
if(files[i].getPath().endsWith(extension)){ PImage img=loadImage(files[i].getAbsolutePath());
images.add(img);
PVector q=new PVector(40, 20,20);
q=heikin(img);
ps = (PVector[]) append(ps,q);
}
}
}
}
void sys(){
fill(225,107,140);
textSize(20);
text("X:",420,37);
text("Y:",420,67);
text("Z:",420,97);
text("R:",420,127);
text(images.size(),100,100);
text(ps.length,130,100);
if (mousePressed == true) {
if(mouseX>450&&mouseX<450+255){
if(mouseY>30&&mouseY<50){ a=mouseX; } if(mouseY>60&&mouseY<80){ b=mouseX; } if(mouseY>90&&mouseY<110){ c=mouseX; } if(mouseY>120&&mouseY<140){ r=mouseX; } if(mouseY>160&&mouseY<290){ for(int i=0;i<ps.length;i++){ if(((ps[i].x-a+450)*(ps[i].x-a+450)+(ps[i].y-b+450)*(ps[i].y-b+450)+(ps[i].z-c+450)*(ps[i].z-c+450))<(r-450)*(r-450)){ PImage s = (PImage) images.get(i); s.save("r"+ps[i].x+"g"+ps[i].y+"b"+ps[i].z+".png"); } } } }
}
noStroke();
fill(255,196,8);
rect(a,30,10,20);
rect(b,60,10,20);
rect(c,90,10,20);
rect(r,120,10,20);
fill(a-450,b-450,c-450);
rect(450,160,50,130);
fill(a-450+((r-450)/2),b-450,c-450);
rect(510,160,30,60);
fill(a-450+r-450,b-450,c-450);
rect(510,230,30,60);
fill(a-450,b-450+((r-450)/2),c-450);
rect(545,160,30,60);
fill(a-450,b-450+r-450,c-450);
rect(545,230,30,60);
fill(a-450,b-450,c-450+((r-450)/2));
rect(580,160,30,60);
fill(a-450,b-450,c-450+r-450);
rect(580,230,30,60);
fill(a-450-((r-450)/2),b-450,c-450);
rect(615,160,30,60);
fill(a-r,b-450,c-450);
rect(615,230,30,60);
fill(a-450,b-450-((r-450)/2),c-450);
rect(650,160,30,60);
fill(a-450,b-r,c-450);
rect(650,230,30,60);
fill(a-450,b-450,c-450-((r-450)/2));
rect(685,160,30,60);
fill(a-450,b-450,c-r);
rect(685,230,30,60);
}
void points(float x,float y,float z){
pushMatrix();
translate(x,y,-z);
fill(x,y,z);
ellipse(0,0,10,10);
popMatrix();
}
PVector heikin(PImage p){
float re = 0.0;
float gr = 0.0;
float bl = 0.0;
PVector q=new PVector(40, 20,20);
for ( int y = 0; y < p.height; y++){
for ( int x = 0; x < p.width; x++){ re+=red(p.get(x,y)); bl+=blue(p.get(x,y)); gr+=green(p.get(x,y)); }
}
q.x=re/(p.heightp.width);
q.y=gr/(p.heightp.width);
q.z=bl/(p.height*p.width);
return q;
}
void db(){
pushMatrix();
translate(255/2,255/2,-255/2);
noFill();
stroke(0);
box(255);
translate(a-450,b-450,-c+450);
popMatrix();
pushMatrix();
translate(a-450,b-450,-c+450);
sphere(r-450);
popMatrix();
}
###その他
・実行はでき、目的どうりの動作もした。
・表示させた文字によると、上記のコードのimagesのサイズが6となっており、用意したファイル数が6を超えても6のまま。
・ファイル数が6より少ない場合は全部読み込まれる。
自分は読み込み枚数の上限を設定していないはずですので、もし原因が分かる方がいらっしゃいましたら、教えて頂けると嬉しいです。

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/03/07 18:54