ヒストグラム表示用のJavaアプレットを作ってみました。
PhotoXP掲示板にもヒストグラム表示機能を付けたので、画像の下にあるヒストグラムというリンクをクリックしてみてください。JavaVMが入ってない人はこちらDSC_8897.jpg

使い方は、まず画像が置いてあるサーバに 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... 続きを読む

コメント(2)

MoonWolf :

RGB使って3チャネルのヒストグラムなら表示できそうじゃないですか?(from mixi)

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

コメントする

このブログ記事について

このページは、PhotoXPが2004年10月 3日 02:53に書いたブログ記事です。

ひとつ前のブログ記事は「Trash Live@四谷フォーバレー」です。

次のブログ記事は「新機能盛りだくさんなPhotoXP 1.6」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

Powered by Movable Type 4.21-ja