yendo weblog


Palm 向け画像形式への GNU/Linux 上での変換

PictureGear Pocket + pgpf-tools

CLIE で画像を持ち運ぼうと思い立つ。 160x160、グレースケール 4 階調 (実質 2.5 階調みたいなもの) の Visor では、 画像の閲覧はかなり厳しいものがあったが、 ハイレゾ 320x320、16 bit ハイカラーの CLIE なら画像の閲覧も十分実用になる。 ただ OS 4.1 のこの機種では jpeg を直接扱うことは実質できないので、 Palm 向けの画像形式への変換が必要になる。

Palm 向けの画像閲覧ソフトや変換ソフトはいろいろあるけど、 GNU/Linux 上で画像変換を行なえ、 かつ閲覧ソフトが無料 (フリーとは言わないにしろ) のものは多くはない。 Visor では netpbm 収録の pgmtoimgv で Image Viewer 形式に変換した画像を TinyViewer で閲覧していたが、同様のことをハイレゾ、ハイカラー対応の CLIE でも行ないたいわけだ。

いろいろ探したり、検討してみたが、閲覧ソフトとしては CLIE に内蔵されて いる PictureGear Pocket を使うことにした。 というのも PictureGear Pocket で扱う画像形式 への UNIX 用変換ソフトを見付けたからだ。 PictureGear Pocket は、PictureGear Pocket Format (pgpf) という 専用の画像形式を扱うが、Patrick Reynolds 氏作の pgpf-tools なら ppm 形式とこの pgpf 形式との相互変換ができる。 例えば jpeg から pgpf 形式への変換は、コマンドラインから以下のように行なう。

% djpeg foo.jpg | ppm2pgpf 'Image description' > foo.prc

素晴らしい。変換した prc ファイルを CLIE に転送すれば、 PictureGear Pocket でちゃんと閲覧できる。 なお、Palm 上で利用できる pgpf 形式の無料閲覧ソフトとしては Polar もある。

pgpf-tools の改変

ただ、この ppm2pgpf での変換ではちょっと気になることがあった。 ppm2pgpf は PictureGear Pocket 用のサムネイルを生成してくれるが、 元画像が正方形でない場合サムネイルの背景色が黒く、 またその位置がセンタリングされていない。 Windows 上の無料変換ソフト PGPmaker は、サムネイルの背景色は指定できるし、 サムネイルのセンタリングもしてくれる。 ということで、ソースを弄ってみた。

まず背景色については簡単。関数 ppmcrop の最後の三つの引数に RGB をそれぞれ 指定すれば良い。私は白にした。

--- ppm2pgpf.c.org      2006-01-07 18:03:29.000000000 +0900
+++ ppm2pgpf.c  2006-01-06 12:49:51.000000000 +0900
@@ -89,7 +89,7 @@
                ppmscale(&thumb_ppm, 44, 44*ppm.height/ppm.width);
        else
                ppmscale(&thumb_ppm, 44*ppm.width/ppm.height, 44);
-       ppmcrop(&thumb_ppm, 44, 44, 0, 0, 0);
+       ppmcrop(&thumb_ppm, 44, 44, 255, 255, 255);

        if (indexed) ppmdither(&ppm);
        ppmdither(&thumb_ppm);

一方、サムネイルのセンタリングについてはちょっと面倒くさいが、 適当にソースを改変した。 ちゃんと検証したわけではないので問題があるかもしれないが、 とりあえずは意図したように動いているようだ。

--- libppm.c.org	2006-01-07 18:03:09.000000000 +0900
+++ libppm.c	2006-01-07 01:01:21.000000000 +0900
@@ -172,6 +172,7 @@
   PEL *nimg, *exp;
   int x, y;
   int uh, uw;
+  int offset_x, offset_y;
 
   if (p->greyscale) {
     fprintf(stderr, "Cropping of greyscale images not supported.\n");
@@ -185,22 +186,19 @@
   uh = (nh < p->height) ? nh : p->height;
   uw = (nw < p->width) ?  nw : p->width;
 
-  for (y=0; y<uh; y++) {
-    memcpy(&nimg[y*nw*3], &p->data[y*p->width*3], uw*3);
-    exp = &nimg[y*nw*3+uw*3];
-    for (x=0; x<nw-uw; x++) {
-      *exp++ = bg_r;
-      *exp++ = bg_g;
-      *exp++ = bg_b;
-    }
-  }
-  exp = &nimg[uh*nw*3];
-  for (x=0; x<(nh-uh)*nw; x++) {
+  exp = &nimg[0];
+  for (x=0; x<nh*nw; x++) {
     *exp++ = bg_r;
     *exp++ = bg_g;
     *exp++ = bg_b;
   }
 
+  offset_x = (nw-uw)/2*3;
+  offset_y = (nh-uh)/2*3*nw;
+  for (y=0; y<uh; y++) {
+    memcpy(&nimg[y*nw*3+offset_x+offset_y], &p->data[y*p->width*3], uw*3);
+  }
+
   ppmdestroy(p);
   p->width = nw;
   p->height = nh;

私は Debian を使っているので、上記パッチを当てたパッケージをでっち上げた。 よろしければどうぞ。

変換スクリプト

ついでに、毎回コマンドを叩くのは面倒なので 簡単なスクリプトも書いてみた。実行には ImageMagick が必要だが、ImageMagick で扱える画像なら何でも変換し、 jpilot によるインストールの予約まで行なう。

#!/bin/sh

tmp_dir="/tmp"

while [ $# -gt 0 ]; do

    file=${1##*/}
    name=${file%.*}
    title=`echo $name | nkf -s`
    tmp="$tmp_dir/$name.prc"
    size=`identify -format "%w %h" $1`

    if [ ${size% *} -gt ${size#* } ]
    then 
	resize="320x"
    else 
	resize="x320"
    fi

    convert $1 -resize $resize ppm:- | ppm2pgpf "$title" > $tmp

    echo $tmp >> ~/.jpilot/jpilot_to_install

    shift

done

このスクリプトを ~/.gnome2/nautilus-scripts/ におけば、 Nautilus 上で選択した画像ファイルの変換およびインストール予約もできる。 画像についてもこれでようやく Windows 並みかな。

2006/01/18 (Wed) 01:50 | タグ: computer


同じカテゴリの最新記事

  1. Gtk2-Perl でバックグラウンド動作
  2. Twitim: Twitter 専用 XMPP クライアント
  3. X でのデュアルモニター (ATI 編)
  4. X でのデュアルモニター (NVIDEA 編)
  5. scanbuttond for EPSON GT-S600/GT-F650