pngcat.pl はありますか?

[上に] [前に] [次に]
むねぞー [E-Mail] 2000/02/12(土) 19:07:03
はじめまして、むねぞーと申します。
とほほさん作 gifcat.pl のPNG版を探しております。

まりお 2000/02/13(日) 00:26:37
pngの合成はperlだけでは難しいかと・・・

B-Cus 2000/02/13(日) 00:45:37
Chart::PNGgraph (S/SB/SBONDS/Chart-PNGgraph-1.15.tar.gz)
Chart::PNGgraph::area (S/SB/SBONDS/Chart-PNGgraph-1.15.tar.gz)
Chart::PNGgraph::axestype (S/SB/SBONDS/Chart-PNGgraph-1.15.tar.gz)
Chart::PNGgraph::bars (S/SB/SBONDS/Chart-PNGgraph-1.15.tar.gz)
Chart::PNGgraph::colour (S/SB/SBONDS/Chart-PNGgraph-1.15.tar.gz)
Chart::PNGgraph::lines (S/SB/SBONDS/Chart-PNGgraph-1.15.tar.gz)
Chart::PNGgraph::linespoints (S/SB/SBONDS/Chart-PNGgraph-1.15.tar.gz)
Chart::PNGgraph::mixed (S/SB/SBONDS/Chart-PNGgraph-1.15.tar.gz)
Chart::PNGgraph::pie (S/SB/SBONDS/Chart-PNGgraph-1.15.tar.gz)
Chart::PNGgraph::points (S/SB/SBONDS/Chart-PNGgraph-1.15.tar.gz)
Chart::PNGgraph::utils (S/SB/SBONDS/Chart-PNGgraph-1.15.tar.gz)
Image::Info::PNG (GAAS/Image-Info-0.04.tar.gz)
PNGgraph        (S/SB/SBONDS/PNGgraph-1.11.tar.gz)
PNGgraph::area  (S/SB/SBONDS/PNGgraph-1.11.tar.gz)
PNGgraph::axestype (S/SB/SBONDS/PNGgraph-1.11.tar.gz)
PNGgraph::bars  (S/SB/SBONDS/PNGgraph-1.11.tar.gz)
PNGgraph::colour (S/SB/SBONDS/PNGgraph-1.11.tar.gz)
PNGgraph::lines (S/SB/SBONDS/PNGgraph-1.11.tar.gz)
PNGgraph::linespoints (S/SB/SBONDS/PNGgraph-1.11.tar.gz)
PNGgraph::mixed (S/SB/SBONDS/PNGgraph-1.11.tar.gz)
PNGgraph::pie   (S/SB/SBONDS/PNGgraph-1.11.tar.gz)
PNGgraph::points (S/SB/SBONDS/PNGgraph-1.11.tar.gz)
PNGgraph::utils (S/SB/SBONDS/PNGgraph-1.11.tar.gz)

ってのがあるけど、gifcat.pl 相当のことができるかどうかは知らない。
# 切り貼りくらいはできてもいいような気がするけど、
# PNGgraph ってモジュール名から言うとできないような気も。

Sasuke 2000/02/13(日) 00:54:12
PNGgraphはインストールしないとダメだから、一般のプロバじゃ使えません。

B-Cus 2000/02/13(日) 00:58:29
ホームディレクトリの下にインストールできるとこって、
そんなに少ないですか?
# まぁ、事実上「インストール可能=telnet可能」だけど。

で、落としてちょっと眺めてみた結果、残念ながら PNG の結合は
できない模様。

2000/02/13(日) 01:11:44
gifcat.plもアニメGIFのフォーマットを利用してますし、pngの圧縮のアルゴリズムはgifよりかなり高度ですから、やはり合成はmng待ちではないでしょうか?

B-Cus 2000/02/13(日) 01:12:28
またモジュールになってしまうけれど、GD モジュールでできないかなぁ。
(Cの) gd ライブラリを使ってる fly コマンドではできるから、同じく
(Cの) gd ライブラリを使う GD モジュールでもできなくはないと思うんだよね。
# あ、よく見たら PNGgraph も GD モジュール使ってるのね。

なお、モジュールを使わない方法は全く思いつきません。

むねぞー [E-Mail] 2000/02/13(日) 13:56:01
[[解決]]
質問者のむねぞーです。

現規格のPNGに対して、gifcat.pl の機能を実現しようとしたら、
まず圧縮を解いてイメージデータを合成した後、再び圧縮して
CRCを生成しなくてはならないという処理になるだろうから、
そういったperlのライブラリを作るのも難しい(大変)だろうし、
処理速度の面でも gifcat.pl と比べればかなり「重い」ものに
なってしまうだろうと考えてよろしいでしょうか。
#PNGの規格に付いてちょっと調べただけなので
#誤った解釈をしていたらごめんなさい。

質問に対する回答をまとめると、
「カウンターCGIなどで使うような
 お手軽なperlのライブラリは今のところ無い(ようだ)」
というわけで、一応解決ということにさせて頂きます。

最後に、フォローして頂いた方々に深く感謝いたします。

ふじ 2000/02/13(日) 15:54:45
解決済ですが、GD モジュール使えばできると思います。

copy $image->copy(sourceImage,dstX,dstY,srcX,srcY,width,height)

こんなのがあるので、元ネタの PNG ファイルからコピーして行けば。
どれくらい重くなるかは分かりませんが、時間あったらとほほカウンタを
PNG 版に改造してベンチ取ってみます。

ふじ 2000/02/16(水) 02:25:05
遅くなりました。
PNGの連結ですが、GD モジュールで可能でした。具体的には、以下のようなソースで。
---------------
use GD;
$w = 17;
$h = 25;
$newImage = new GD::Image($w * 6, $h);
for $num (split('', sprintf("%06d", $ARGV[0]))){
    open (PNG, "< $num.png");
    $numImage = newFromPng GD::Image(PNG);
    close PNG;
    $newImage->copy($numImage, $keta * $w, 0, 0, 0, $w, $h);
    $keta ++;
}
print $newImage->png;
----------
0.png ... 9.png の画像ファイルを、カウンタ画像のように連結して
標準出力に書き出すものです。

速度についてですが、gifcat.pl を使って GIF(0.png .. 9.png と同様の 0.gif ... 9.gif)
を連結するスクリプトを書いて、CGI 経由で起動してベンチを取ってみましたが
# use とか、 require はスクリプト中で一度しか実行されないので Benchmark モジュール
# ではうまくトータルの実行速度が測れない…
GDモジュールを使う方が、gifcat.pl を使うよりも 4倍程、遅かったです(^^;;
GD モジュールの機能を考えればしかたない、とも思えますが。

救いは、GDで連結した画像のサイズは gifcat で連結したものよりも小さくなる
ことでしょうか。gifcat はアニメ GIF なので、
連結したそれぞれの画像サイズの合計 + α になりますが、
GD を使うと一枚の画像として(圧縮されて)できるので、サイズが小さくなります。
具体的には各桁の数字画像ファイルが 1KB 程度で、6桁分連結した場合、
gifcat : 6KB
GD(PNG) : 2KB以下
となりました。バラツキはあると思いますが。

解決済なのに、長々と失礼しました。興味あったもので(^^;

ポケ鬼!! 2000/02/16(水) 23:43:31
興味があったんでpngを合成して吐き出すexeを作ってみたんですけど、gdlibは透過pngに対応してないのでしょうか??
透過を使ってないpngはきれいに合成されますが、透過を使ったpngだとベタベタに潰れてしまいます。

ふじ 2000/02/17(木) 00:17:51
perldoc GD によると、

# make the background transparent and interlaced
$im->transparent($white);
$im->interlaced('true');

てな記述があるので対応しているのでは・・・
#って未確認です(^^;

ポケ鬼!! 2000/02/17(木) 02:11:02
できました!!
最初から透過属性のついてるpngを合成すると透過が外れてしまうんですね。考えてみれば当たり前かも。
透過を解除してから合成して、最後にもう一回透過にしたらできました。
これでpngカウンタも作れそうです。

[上に] [前に] [次に]