ぴんぐ

フルカラー画像を指定の色パレットに寄せたPNG画像へ変換するプログラムを作っています.パレット番号を指す主の画像データ部分の圧縮に数日,手こずりました.圧縮アルゴリズムは,LZ77とハフマン符号化をコラボレーションしたデフレートなるものが使われているようです.

フリーのzlibなるライブラリを使えば実現できるそうですが,.NET Framework 4.5以降のSystem.IO.Compression.DeflateStreamでもこれが使われているとのこと.余計な外のライブラリとか使いたくないので,.NET一本で行きました.初めて使うのであれこれ調べつつ.

ところが,そうして作ったPNGファイルが,これまで使っていた他のプログラムで開けないとの指摘を受けました.たしかに,貰ったその既成プログラムで開けません.こちらで開けるのは,同じ.NET Frameworkで開こうとするから良い感じに互換するってことでしょうか.エラーメッセージはPNGファイルの形式不正の雰囲気を醸していましたけど,タグ構成とか合っているとしか思えないし,ちゃんとIDATチャンクデータの冒頭にzlibのヘッダっぽい2バイトも足しているというのに,むむむ.

攻め方を変えて今度はDeflateStreamを使わず,単純にSystem.Drawing.BitmapでFormat8bppIndexedなPNGを出力してみました.そもそもこれが一番楽な方法でした.が,これでも貰った既成プログラムで開けません.

仕方ない,zlibを導入するか.しかし,良い感じにDLL化されたものが見つかりません.調べるの下手なのよね.結局,ソースコードをDLしてビルドしてDLLにしました.メソッドの使い方とか呼び方とかいろいろ調べ,何とか実装.が,これでも貰った既成プログラムで開けません.圧縮レベルとかいろいろ変えても駄目.

貰った既成プログラムの更新日,15年近く前になっていました.これはもしや,最新のzlibじゃ駄目ってことかな.ってことで,古のソースコードを掘り出しました.といってもせいぜい10年前のやつ.それ以上は私のGitHub力不足で引き出せませんでした.

さて,その古のソースコード,DLL化するのに一苦労.最新版のはVisual Studioですぐビルドできるようにプロジェクトファイルが付いてきたのですが,10年前のにはありません.そもそも,Linuxを想定されてか,ちょろちょろコンパイルエラーも出ちゃう.地道に潰して,無事DLLにしました.が,これでも貰った既成プログラムで開けません.

libPngを使ってみるか.いや,どの道その中でzlibが使われるしな.もう万策尽きているのでは.そろそろ白旗か.ってところで,コーディングミスに気づきました.

マネージの画像データ配列をアンマネージ配列へコピーせずにzlibのメソッドを呼び出していました.なるほど,メモリ上の不定値群を圧縮して突っ込んだPNGを生成していたのね.そこ直したら無事成功.やったね.今日のてんびん座1位は伊達じゃなかった.なお,.NET Frameworkでの圧縮はうまく行かず終いでした.

今日観たアニメ(4354)

  • [B]怪物事変「怪物事変」(第12話 3/28深夜)

    日曜深夜のTOKYO MXで放送されていたこの番組が終了しました.氷を纏う晶兄と戦うべく,不死なのをいいことに,野火丸の狐火で燃やされ続けながら戦う夏羽,凄いな.一件落着した兄さん,石が手から離れたら話が通じる良い感じ.一緒に旅に出る風の晶の臍だしルックが可愛くて反則.それ以上に最近の出番少な目だった紺@花守ゆみり萌え.

  • [B]IDOLY PRIDE「サヨナラから始まる物語」(第12話 3/28深夜)

    日曜深夜のTOKYO MXで放送されていたこの番組が終了しました.決勝戦はサニーピースと月のテンペストによる同事務所対決.引き分けで両者優勝は微妙.が,優勝後歌唱,同事務所だからこそできる合同歌唱熱い.出たり消えたりの麻奈,ギリギリ.最後は思い出の学校の教室,に勝手に入っていいんか.

  • [A]宇宙よりも遠い場所「きっとまた旅に出る」(第13話 3/28深夜)

    日曜深夜のTOKYO MXで再放送されていたこの番組が終了しました.自分だけ素敵ミッションに誘われなかったり,自分だけ誘われたミッションは全員参加だったり,日向いいわ.そうか,4人組は越冬せずに帰還か.最後にやりたいこと,隊員みんなと野球ってのいいね.サインを貰う隊員,そーいや結月は芸能人でした.

  • [C]EX-ARM「偉大な一歩」(第12話 3/28深夜)

    日曜深夜のTOKYO MXで放送されていたこの番組が終了しました.ベータ退治で終了でも良かったのに,もう一波乱が用意されていました.ベータの瘴気に中てられた戦略AIが世界中の軍事設備を牛耳って暴走する展開.1話で収まりきってない感じが.