Javaで画像を取り扱うにはJava2Dのようなライブラリを使うなど様々な方法があるが、ここではgetRGB,setRGBメソッドを使って 直接画素値を操作する。
BufferedImage内の画素にアクセスするにはgetRGB()メソッドとsetRGB()を使う。書式はそれぞれ
public int getRGB(int x,int y)
public void setRGB(int x,int y,int rgb)
座標値x,yにある画素値をそれぞれ取得、設定する。
使用例は以下の通りである。
int[][] rgb=new rgb[height][width];
//画素の取得
for(int v=0;v < height;v++) {
for(int u=0;u < width;u++) {
rgb[v][u]=image2.getRGB(u, v);
}
}
//画素の設定
for(int v=0;v<height;v++) {
for(int u=0;u<width;u++) {
image1.setRGB(u, v, rgb[v][u]);
}
}
画素値はint型で返され、デフォルトでは、アルファ値付きのRGB カラーモデル (TYPE_INT_ARGB)になっている。
int pix=0xffff0000;
このままだと扱いづらいのでR成分、G成分、B成分に分解・合成する。
int rgba;
int r;
int g;
int b;
int a;
//分解
a=rgba>>24;
r=rgba>>16&0xff;
g=rgba>>8&0xff;
b=rgba&0xff;
//合成
rgba=(a<<24)|(r<<16)|(g<<8)|b;
//画素の取得
for(int v=0;v<height;v++) {
for(int u=0;u<width;u++) {
rgba[v][u]=image2.getRGB(u, v);
}
}
//画素の分解
for(int v=0;v<height;v++) {
for(int u=0;u<width;u++) {
a[v][u]=rgba[v][u]>>24&0xff;
r[v][u]=rgba[v][u]>>16&0xff;
g[v][u]=rgba[v][u]>>8&0xff;
b[v][u]=rgba[v][u]&0xff;
}
}
//ネガポジ反転(255-画素値)
for(int v=0;v<height;v++) {
for(int u=0;u<width;u++) {
r[v][u]=255-r[v][u];
g[v][u]=255-g[v][u];
b[v][u]=255-b[v][u];
}
}
//画素の合成
for(int v=0;v<height;v++) {
for(int u=0;u<width;u++) {
rgba[v][u]=(a[v][u]<<24)+(r[v][u]<<16)+(g[v][u]<<8)+b[v][u];
}
}
//画素の設定
for(int v=0;v<height;v++) {
for(int u=0;u<width;u++) {
image1.setRGB(u, v, rgba[v][u]);
}
}
for(int v=0;v<height;v++) {
for(int u=0;u<width;u++) {
r[v][u]/=128;
g[v][u]/=128;
b[v][u]/=128;
r[v][u]*=128;
g[v][u]*=128;
b[v][u]*=128;
}
}
for(int v=0;v<height;v++) {
for(int u=0;u<width;u++) {
double pr=r[v][u];
double pg=g[v][u];
double pb=b[v][u];
pr/=128.0;
pg/=128.0;
pb/=128.0;
pr*=128.0;
pg*=128.0;
pb*=128.0;
r[v][u]=(int)pr;
g[v][u]=(int)pg;
b[v][u]=(int)pb;
}
}
for(int v=0;v<height;v++) {
for(int u=0;u<width;u++) {
double pr=r[v][u];
double pg=g[v][u];
double pb=b[v][u];
pr+=20.0;
pg+=20.0;
pb+=20.0;
r[v][u]=(int)pr;
g[v][u]=(int)pg;
b[v][u]=(int)pb;
}
}
public double clip(double x) {
x=x<0?0:x;
x=x>255?255:x;
return x;
}
画素の値が255より大きい場合は255、0より小さいばあいは0に設定するという簡単な処理。
今回は最大値を超えた場合だが当然計算の結果が負になることもありうる(負のオーバーフロー)
for(int v=0;v<height;v++) {
for(int u=0;u<width;u++) {
double pr=r[v][u];
double pg=g[v][u];
double pb=b[v][u];
pr+=20.0;
pg+=20.0;
pb+=20.0;
r[v][u]=(int)clip(pr);
g[v][u]=(int)clip(pg);
b[v][u]=(int)clip(pb);
}
}