PhotoXP: 2004年10月アーカイブ

こちらで質問のあった、PENDINGモードを実装したPhotoXP 1.6.4をリリースします。 config.rbの設定を、
DEFAULT_STATUS = 'PENDING'
とするとこで、新規投稿があっても一旦保留状態に置いて、 管理モードから写真ごとに表示/削除を行うといった運用が可能になります。
PhotoXPのバージョン1.6.3をリリースしました。
今回の修正点は、 の2点です。
その後、Webの記事を漁ったり、PhotoXPに投稿されている色々な画像の(輝度)ヒストグラムを見まくったりしたのですが、やはりRGBチャネル別のヒストグラムが無いと、いまいち画像チェックの参考にはならないという結論に至りました。
そこで、今度はRGBとグレースケール(L)を、それぞれOn/Off可能にしたアプレットを作ってみました。
DSC_8897.jpg
histogram_max.png
以前の輝度ヒストグラムでは、右側に線が立っているため飽和がある事は分かりますが、どのチャネルの色なのかまでは分かりませんでした。 しかし、今回のヒストグラムでは赤チャネルの飽和、青チャネルのつぶれを確認でき、グレースケールから露出はアンダー寄りであるといった情報を読み取れます。
しばらくPhotoXPサイトでテストしつつ、次期リリースにはこちらのアプレットを添付したいと思います。
旧バージョンから1.6.0へのアップグレードでいくつか不具合が発生するので、1.6.1をリリースします。
主な修正点は以下の通り。 GPS問題は純粋にバグ修正、Exif再解析は管理メニューから実行すると、新機能のレンズ情報やファイルサイズが過去の画像にも表示されます。
そして、最後の移行ツールは、1.6.0にして今までの投稿が消えてしまったという方向けです。 実際には今までデータベースにSDBM形式を使っていて、今回からGDBMになったため消えたように見えるだけなので、以下のURLを開くことでSDBMからGDBMへデータをコピーできます。
[掲示板のURL]?&action=sdbm2gdbm
掲示板のURLは、例えばhttp://photoxp.s56.xrea.com/photoxp/photoxp.cgiなどです。 空のGDBMに対してしかコピーが出来ないので、1.6.0で投稿が消えてしまった後に、一度でも投稿をした人は、
data/photoxp/board.gdbm
というファイルを削除してから、上記のURLを開くとバージョンアップ前の投稿データが復活します。
この辺をご覧の皆さんはご存知かと思いますが、ここ1、2週間でPhotoXPに色々と新機能が追加されました。
機能追加もひと段落したので、ここらでPhotoXP1.6.0としてリリースしたいと思います。 主な修正点は以下の通り。
  • 個別の返信を削除可能に。
  • IPアドレス/ドメインによるアクセス制限
  • レンズ情報を表示(Nikon、Canonのみ)
  • ヒストグラム表示
  • linkタグによるナビゲーションの追加
個別の返信ごとの削除とか、アクセス制限とか当たり前の機能(今まで無かったのです)もようやく実装されたので、試しに使ってみたいという方は、無料レンタルサーバのXREAなどでPhotoXP使ってみてはいかがでしょうか?
何か分からない点があれば、コメント欄にて質問頂ければと思います。
ヒストグラム表示用の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)の方がデジカメ画像のチェックには有用と思われるので、変更しました。 ほんとは、全ての種類のヒストグラムを選べるのが一番良いのですが、それはまた次の課題ということで。。。

このアーカイブについて

このページには、2004年10月以降に書かれたブログ記事のうちPhotoXPカテゴリに属しているものが含まれています。

前のアーカイブはPhotoXP: 2004年8月です。

次のアーカイブはPhotoXP: 2004年11月です。

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

Powered by Movable Type 4.21-ja