mieki256's diary



2006/02/20(月) [n年前の日記]

#1 [cg_tools] _Resynthesizer - 邪魔な部分を除去できる GIMP plugin

_Resynthesizer 解説記事
_20th Century Boy's Programing Zone

わ。こんな機能があったのか…。単にシームレスな画像を作るだけかと思ってた。素晴らしい…。

#2 [cg_tools] アルファチャンネルを持ったpngをグッドに減色して透明度を持ったgifとして保存できるツールはないものかしら

GIMPで、そのへん手作業でやってたのだけど。自動化できないものか…。

といっても、減色する段階で、透明部分と不透明部分の境界がおかしくなるしなぁ。難易度高そう。アルファチャンネルに対して閾値を指定してアレするのであらうか。いや、しかし、透明度が違う時点で色も変わってくるのであらうから、減色処理自体も…。とにかく難しそう。

#3 [cg_tools] GIMPの.xcfをレイヤー毎に連番で保存できるスクリプト

や、元々は Photoshop の .psd のレイヤーを別々に保存したかったんだけど。

~/.gimp-2.2/scripts/ に該当スクリプトを入れたけど、メニューに出てこない。何故。

もしかすると、1.x の頃と違って、メニュー項目が合ってないのかもしれん。とりあえず、"<Image>/Script-Fu/misc/Continuous Save..." に変更してみた。…misc の中に項目が出てきた。これでいいのかな。

一応スクリプトも置いとく。 :

_連番を付けて保存 で紹介されてるスクリプトに対して、透明度を持ったレイヤーに関してゴミが入らないよう、(gimp-drawable-fill tmp-layer TRANS-IMAGE-FILL) を追加して、メニュー位置(?)を変えただけですが…。<つまりたったの2行分しか変えてない。HDDがまた壊れると泣いちゃうので、こっちにもアップロードすることでバックアップ。

_continuous-save_scm.txt 。continuous-save.scm にリネームして、~/.gimp-2.2/scripts/ にコピー。

1.x ならともかく、 2.x の今なら標準でそういう機能がついてそう。と思ってメニューの中を探してみたけど、よくわからず。GAP *1 の中にあっても良さそうなもんだけどな。実はありそうな気もするんだよな…。

*1: GAP = GIMP でアニメーションが作れるパッケージ。

#4 [prog][java] Perlでバイナリを扱う

関連解説をしてるページをメモ。

_Perl の数値変換
_M.Hiroi's Home Page / X68000 Programming / Perl

つまるところ、pack なるものを使うらしい。

Javaってビックエンディアンなのかリトルエンディアンなのか :

どっちだらう。

_データ入出力
数値データはビッグエンディアン(Big-Endian)のバイトオーダで入出力されるようです。Big-EndianはSPARCやMC68000で採用されているバイトオーダですが、ネットワークのバイトオーダもビッグエンディアンであることから分散環境との相性がよいといえます。

しかし問題なのはIntelの8086系のCPUつまりPentiumはリトルエンディアンで あるということです。つまりWindowsで普通に作成されたデータをJavaのデータ入出力機能では入出力できないのです。その他DataOutputに符号無byteと符号無shortをライトする機能がないことには注意が必要です。

データ入出力 より

ビックエンディアンなのね。

_Java でリトルエンディアンのバイナリを読む - にっき (2004-04-06) :

昔は自前でバイトオーダーを入れ替える必要があったが、今は java.nio.ByteBuffer があるので、これを使う。

_ Java でリトルエンディアンのバイナリを読む ▲ より

なるほど。メモさせてもらおう…。
byte[] buff;

// buff にバイナリデータを入れる

ByteBuffer bb = ByteBuffer.wrap(buff); // ByteBuffer でラップ
bb.order(ByteOrder.LITTLE_ENDIAN);     // リトルエンディアンに設定
int intData = bb.getInt();             // 4 バイト読み込む
short shortData = bb.getShort();       // 2 バイト読み込む

_IT覚え書【JAVA】 プログラミング - バイトオーダーの異なるファイルの入出力方法
通常、Windows ではリトル・エンディアン (little endian)、Unix系ではビッグ・エンディアン (big endian) が使われている。ただし、Java の入出力クラスでは、ビッグ・エンディアンが優先されている。

IT 覚え書【JAVA】 プログラミング より

こちらでも、ByteBuffer を使って、エンディアンを変換する方法が紹介されてる。メモさせてもらおう…。
DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream(fileName)));
ByteBuffer bb = ByteBuffer.allocate(64);

//Little Endian ファイルをそのままのバイトオーダーで読み込み、bb へ代入
bb.putInt(dis.readInt());
bb.putInt(dis.readfloat());

//バイトオーダーを Little Endian に変換して、a と b にそれぞれ代入
bb.order(ByteOrder.LITTLE_ENDIAN);
int a = bb.getInt(0);
float b = bb.getFloat(4);

Perlでpackを使う場合、エンディアンをどうするかも指定できるっぽい :

_M.Hiroi's Home Page / X68000 Programming / Perl
大きな位から順番に詰めていくのがビッグエンディアンで、小さな位から詰めていくのがリトルエンディアンです。これは使用している MPU によって異なり、X68k の MPU (680x0) はビッグエンディアンとなります。インテル系の MPU は逆にリトルエンディアンです。

エンディアンに左右されたくない場合は、n / N や v / V を使うといいでしょう。

n ネットワークバイト順 (ビッグエンディアン) による short 値
N ネットワークバイト順 (ビッグエンディアン) による long 値
v VAXバイト順 (リトルエンディアン) による short 値
V VAXバイト順 (リトルエンディアン) による long 値

pack( "N", 0x41424344 ) => "ABCD"
pack( "V", 0x41424344 ) => "DCBA"

M.Hiroi's Home Page / X68000 Programming / Perl より

なるほど…。

#5 [iappli][prog] Perlで、iアプリのスクラッチパッドに置くためのデータを作成するスクリプトを作成

gif画像を連結して一つのファイルにする。それをスクラッチパッドに格納して、スクラッチパッドから画像データを読むことで、逐一サーバから画像を取得しないで済むようにする。らしい。 *1

_Perl表技集 を参考に。
_文字列の連結
_ファイルサイズ取得
_ファイルを一文字列として読み込む
_ディレクトリ内のファイル一覧
_ディレクトリ存在確認
を見ながら作業。ありがたや。

こんな感じかしら。 :

まだ、iアプリ側で読んで確認してないのでバグってる可能性大だけど。とりあえずこういう感じでやればいいのかなと。

(2006/02/24追記。ちと下のはバグってます。)
#!/usr/bin/perl
#
# imgjoin.pl
#
# 指定フォルダ内のgif画像を連結して1つのファイルにする。
#
# usage : perl imgjoin.pl DIR_NAME OUTPUT_FILENAME
# 
# 出力ファイルの先頭には、ヘッダーが入る。
#
# 2byte     ファイル数
# 4byte     1ファイル目 : ファイル実データまでのオフセット
# 4byte     1ファイル目 : ファイル実データのサイズ
# 4byte     2ファイル目 : ファイル実データまでのオフセット
# 4byte     2ファイル目 : ファイル実データのサイズ
#    ...
#
# OUTPUT_FILENAME は拡張子なしで指定。
# (スクリプト中で、.pak .txt 等を付け足してファイル名を決めてる)
#
# ActivePerl-5.8.7.815-MSWin32-x86-211909 で動作確認。
#
# by mieki256
# 2006/02/20 0.01 とりあえず作成。

use strict;

my $ext ="gif";             # 処理する拡張子
my $outdir = "./bin";       # 出力先のディレクトリ名 (最後の '/' は不要)
my $pakext = ".pak";        # パックしたデータファイルの拡張子
my $lstext = ".txt";        # データ順の定義部分を出力する際の拡張子


if ( $#ARGV != 1 ) {
    die "引数が異常です。 : $!";
}

my $dir = $ARGV[0];         # 指定ディレクトリ名を得る
my $outfname = $ARGV[1];    # 出力ファイル名を得る

if ( -d $dir ) {
    print " ... Found Directory : $dir \n";
} else {
    die "Not Found $dir :";
}

# ----------------------------------------
# ファイルリスト取得
my @list = ();
opendir DH, $dir or die "$dir : $!";
while (my $file = readdir DH) {
    next if $file =~ /^\.{1,2}$/;   # '.' '..' をスキップ
    if ( $file =~ /\.$ext$/i ) {
        push(@list,$file);
    }
}
closedir DH;

if ( $#list < 0 ) {
    die "Not Found .$ext file. : $!";
}

my @sortlist = sort {$a cmp $b} @list;
my @sizelist = ();

# ----------------------------------------
# ファイルサイズ取得
foreach my $f (@sortlist) {
    my $size = -s "$dir/$f";
    print "found $f : size $size\n";
    push(@sizelist, $size);
}
my $binsize = 0;
foreach my $s (@sizelist) {
    $binsize += $s;
}

print " ... ", $#sortlist+1," files. : size = $binsize\n";

# ----------------------------------------
# 結合データ作成

# ヘッダ作成
my $wrdata = pack("n", ($#sizelist + 1) );  # ファイル数
my $offset = 4 + (($#sizelist + 1) * 8);    # 最初のファイルのオフセット
foreach my $size (@sizelist) {
    $wrdata .= pack( "N", $offset);         # オフセット
    $wrdata .= pack( "N", $size );          # ファイルサイズ
    $offset += $size;
}

# ファイルデータ結合
foreach my $f (@sortlist) {
    open(FH, "$dir/$f") || die $!;
    binmode FH;
    my $data;
    {
        local $/ = undef;
        $data = <FH>;
        $wrdata .= $data;
    }
    close(FH);
}

# 結合したデータをファイルに出力
open(OUT,"> $outdir/$outfname$pakext") || die $!;
binmode OUT;
print OUT $wrdata;
close OUT;

print " ... write $outdir/$outfname : length = ", length $wrdata, "\n";


# ついでに、.java 内で使う、定義部分のファイルを出力しておく
# (出力ディレクトリがちと違うので注意。)

open(OUTLST,"> $dir/$outfname$lstext") || die $!;
my $c = 0;
foreach my $f (@sortlist) {
    $f =~ tr/[a-z]/[A-Z]/;
    $f =~ tr/\./_/;
    $f =~ /(.*)_GIF/;
    my $p = $1;
    print OUTLST "\tprivate final int IMG_$p = $c;\t// ", $sizelist[$c],"\n";
    $c++;
}
print OUTLST "\tprivate final int IMG_NUM_MAX = ", $c - 1, ";\n";
close(OUTLST);

exit 0;


本来、java でやったほうが勉強になるのかもしれんけど…。

_2php : DoJa HttpConnection :

2006/02/24追記。バグってた。 :

ヘッダ部分のアドレス算出が2バイト多い。ファイル数を当初4バイトで収めてたのを忘れてた。
# ヘッダ作成
 ...
my $offset = 4 + (($#sizelist + 1) * 8);    # 最初のファイルのオフセット
を、
# ヘッダ作成
 ...
my $offset = 2 + (($#sizelist + 1) * 8);    # 最初のファイルのオフセット
に修正すれば、期待通りの結果を出力してくれるはず。

iモード端末は機種によって通信サイズ制限があるらしい。もしかするとこのままじゃ使えない可能性大。

*1: アプリ本体の .jar に画像等を含ませることもできるけど、アプリ用の容量は10K〜30KByteと少ないので、あっという間に容量オーバーしてしまう。

以上、1 日分です。

過去ログ表示

Prev - 2006/02 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project