ヒストグラム表示アプレット
ヒストグラム表示用のJavaアプレットを作ってみました。
PhotoXP掲示板にもヒストグラム表示機能を付けたので、画像の下にあるヒストグラムというリンクをクリックしてみてください。JavaVMが入ってない人はこちら。
使い方は、まず画像が置いてあるサーバに HistogramApplet.classをコピーします。
次に、APPLETタグを記述します。codebaseにHistogramApplet.classを置いたディレクトリのURLを指定し、param name=srcで画像ファイルのURLを指定します。(注: HistogramApplet.classと画像は同一のホスト、この例の場合example.comに置く必要があります)
ソースコードは以下の通り。
PhotoXP掲示板にもヒストグラム表示機能を付けたので、画像の下にあるヒストグラムというリンクをクリックしてみてください。JavaVMが入ってない人はこちら。
使い方は、まず画像が置いてあるサーバに HistogramApplet.classをコピーします。
次に、APPLETタグを記述します。codebaseにHistogramApplet.classを置いたディレクトリのURLを指定し、param name=srcで画像ファイルのURLを指定します。(注: HistogramApplet.classと画像は同一のホスト、この例の場合example.comに置く必要があります)
<applet code=HistogramApplet codebase="http://example.com/yourpage/" width=256 height=128>
<param name=src value="http://example.com/yourpage/images/test.jpg" />
</applet>
あと、デザイン上周囲が黒い方が見やすいので、適当に調整してみてください。
ソースコードは以下の通り。
import java.applet.Applet;
import java.awt.*;
import java.awt.image.*;
import java.net.*;
public class HistogramApplet extends Applet {
Image img = null;
int srcWidth, srcHeight;
int[] pixels;
public String getAppletInfo(){
return "PhotoXP Histogram Applet\n" +
"http://www.daifukuya.com/photoxp/";
}
public void init() {
System.out.println(getAppletInfo());
try {
MediaTracker tracker = new MediaTracker(this);
Image srcimg;
String param = getParameter("src");
if (param.startsWith("http:")) {
srcimg = getImage(new URL(param));
} else {
srcimg = getImage(getDocumentBase(), param);
}
tracker.addImage(srcimg, 1);
tracker.waitForAll();
srcWidth = srcimg.getWidth(null);
srcHeight = srcimg.getHeight(null);
pixels = new int[srcWidth * srcHeight];
PixelGrabber pg = new PixelGrabber(srcimg, 0, 0, srcWidth, srcHeight, pixels, 0, srcWidth);
pg.grabPixels();
} catch (Exception e) {
e.printStackTrace();
}
}
public void calculate() {
Dimension d = size();
if (d.width == 0) return;
int step = d.width;
int[] histogram = new int[step];
for (int y = 0; y < srcHeight; y++) {
for (int x = 0; x < srcWidth; x++) {
int pixel = pixels[y * srcWidth + x];
int r = (pixel >> 16) & 0xff;
int g = (pixel >> 8) & 0xff;
int b = (pixel) & 0xff;
// int brightness = (int) ((r*0.299+g*0.587+b*0.114)*(step - 1)/255); // gray scale
int cmax = (r > g) ? r : g;
if (b > cmax) cmax = b;
int brightness = (int)((double)cmax*(step-1)/255.0f); // brightness
histogram[brightness]++;
}
}
int max = 0;
for (int i = 0; i < step; i++) {
max = (histogram[i] > max) ? histogram[i] : max;
}
img = createImage(d.width, d.height);
Graphics g = img.getGraphics();
g.setColor(Color.black);
g.fillRect(0, 0, d.width, d.height);
g.setColor(Color.darkGray);
g.drawRect(0, 0, d.width-1, d.height-1);
for (int i = 1; i < 5; i++) {
g.drawLine(i*step/4 - 1, 0, i*step/4 - 1, d.height - 1);
}
g.setColor(Color.white);
for (int i = 0; i < step; i++) {
if (histogram[i] == 0) continue;
g.drawLine(i, d.height - 1, i, d.height - 1 -(histogram[i]*d.height)/max);
}
}
public void paint(Graphics g) {
if (img == null) {
calculate();
}
g.drawImage(img, 0, 0, null);
}
}
あと、最初はグレースケールのヒストグラムを表示していたのですが、輝度(brightness、HSBカラーモデルのB)の方がデジカメ画像のチェックには有用と思われるので、変更しました。
ほんとは、全ての種類のヒストグラムを選べるのが一番良いのですが、それはまた次の課題ということで。。。
トラックバック(1)
このブログ記事を参照しているブログ一覧: ヒストグラム表示アプレット
このブログ記事に対するトラックバックURL: http://www.daifukuya.com/photoxp/mt-tb.cgi/136
» ヒストグラム表示Flash(PhotoXP)~のトラックバック
勉強のために、PhotoXP 1.xで使っているヒストグラム表示Java Ap... 続きを読む

RGB使って3チャネルのヒストグラムなら表示できそうじゃないですか?(from mixi)
とりあえず輝度(HSBのB)、グレースケール、R、G、Bと選べるようにするのは良いですが、
ヒストグラムにも色々あって、
http://arena.nikkeibp.co.jp/tec/camera/20040302/107348/
どれをデフォルト表示にするのが適切なのか難しいですね。。。