saitoha / libsixel

A SIXEL encoder/decoder implementation derived from kmiya's sixel (https://github.com/saitoha/sixel).
MIT License
2.49k stars 83 forks source link

img2sixel で透過色の背景色として黒以外の色を指定できるようにして欲しい #25

Closed msmhrt closed 9 years ago

msmhrt commented 9 years ago

掲題の通りですが、もし何らかの方法で透過色の背景色を指定できるようでしたらその方法を教えていただけないでしょうか?

ちなみに、実際に困ったシチュエーションは http://www.fileformat.info/info/unicode/char/01dd/index.htmhttp://www.fileformat.info/info/unicode/char/01dd/latin_small_letter_turned_e.pngw3m で表示しようとした時です。

saitoha commented 9 years ago

掲題の通りですが、もし何らかの方法で透過色の背景色を指定できるようでしたらその方法を教えていただけないでしょうか?

現状は不可能です。 libsixel側で背景色とブレンディングしてやる必要がありますね。

saitoha commented 9 years ago

あ、ちょっと誤認していたけど、今はlibsixel側ではなくimg2sixelの中でalpha成分を抜いてたんですね。 libpngの機能で背景色を設定するような方向で検討してみます。

msmhrt commented 9 years ago

お、期待してます。

上記の画像はとりあえず「コマンド一発で透過 png を綺麗に非透過 png にする」の「綺麗な方法」を参考にして、

$ wget -O - "http://www.fileformat.info/info/unicode/char/01dd/latin_small_letter_tu
rned_e.png" | convert -  \( +clone -alpha opaque -fill white -colorize 100% \) +swap -geometry +0+0 -compose Over -composite -alpha off - | img2sixel

で表示できました。 (どうやら半透明だったらしく、同ページの「スタンダードな方法」ではダメでした。)

saitoha commented 9 years ago

fix-issue-25ブランチに-B/--bgcolorオプションを追加してXParseColor形式の一部

を背景色指定として受け付けるようにしました。(したつもり。まだほぼテストしていません。) 今はまだ、libpngのRGBAフォーマットを読んできた時だけしか有効になりません。

msmhrt commented 9 years ago

fix-issue-25 でビルドして、

$ wget -O - "http://www.fileformat.info/info/unicode/char/01dd/latin_small_letter_turned_e.png" | img2sixel --bgcolor "#FFFFFF"

を試してみましたが、 issue25_01 という結果になりました。

前述した convert コマンドを使った方法だと、 issue25_02 のように表示されます。

saitoha commented 9 years ago

ああ、Debianの1.2.50-2+b2でそれが再現しました。 どうやらまたlibpngバージョン問題っぽいです。

saitoha commented 9 years ago

e3feddd で直したと思っています。 あとはアルファ付きグレイスケールとかパレット指定時の単色キーカラー透過への対応も必要だと思っています。

msmhrt commented 9 years ago

https://github.com/saitoha/libsixel/commit/e3feddd50e80ccf62efa870fa1e705ac9c5e3204 でビルドして前述した再現手順で問題なきことを確認しました。

他の様々なケースについては気長にお待ちしたいと思います。

saitoha commented 9 years ago

8bppパレットの透過PNGに対応(libpng使用時のみ)。

$ convert -background none -fill #f00 -pointsize 100 label:test png:- | img2sixel -B#fabcd0

2015-02-10 1 21 56

4bppとかの透過色付きPNGのテスト用画像はいったいどうしたら作れるのかという問題が出てきていて、 どっかのOSSプロダクトとかで色んなパターンのテスト用画像溜め込んでいるところがあったら知りたいです。

hajimehoshi commented 9 years ago

http://www.schaik.com/pngsuite/ PngSuite はいかがでしょうか。

msmhrt commented 9 years ago

すみません。念のために確認させていただきたいのですが、

という理解であってますでしょうか?

手元の環境では https://ssl.gstatic.com/ui/v1/icons/mail/images/star_on_sm_2.gif 等で確認して透明色が透明にならなかったのですが、こちらの環境で発生する問題で本来は透明になるはずだったりするとマズいなと思ったので確認させていただきました。

saitoha commented 9 years ago

@hajimehoshi ありがとうございます!これは知りませんでした。 Transparencyのテストに4bpp(16色)のパレットはなかったようですが、ほかのケースをテストするのにかなりl有用だと思います。

saitoha commented 9 years ago

@msmhrt

Sixel の仕様は単色カラーキー透過をサポートしているが、現時点の libsixel では透過GIFの透明色は透明にならない。 という理解であってますでしょうか?

はい。合っています。 libsixelの内部では単色カラーキーのインデックス番号を保持していますが、まだそれにアクセスするAPIを公開していません。 例外として、-eオプションでモノクロ出力を指定した時に、背景色を透過色にしています。 (当時はその方がサイズが小さくなる、という理由でそうしました。)

msmhrt commented 9 years ago

@saitoha さん

了解です。ホッとしました。

saitoha commented 9 years ago

@msmhrt これもちょっと前に要望あって調べた時にちょっと挫折していて、たしかフレームごとにインデックスカラー透過色持てる仕様だったように記憶しています。なのでフレーム読み出しのコールバック化が先かなと思っています。

msmhrt commented 9 years ago

@saitoha さん あー、なるほど。これも複数フレームが絡んだ制限だったんですね。 コールバック化が困難で、1フレームかどうかの検出も難しいようでしたら、--static オプションを指定した時だけでも透過色がサポートされれば結構嬉しいかもしれません。

saitoha commented 9 years ago

@msmhrt はい。対応の順序を検討してみたのですが、 まずはこのIssueの主題である、背景色を指定した時のアルファブレンディング対応が優先だと思います。 その後に単色カラーキー透過ができる以下のケースを分けて

  1. PNG/RGB/単色透過
  2. PNG/グレースケール/単色透過
  3. PNG/パレット/アルファ付き(tRNSチャンクからアルファ値が0のものを拾って一つの色にまとめる)
  4. GIF/静止画像

上記の順番(対応が楽そうな順)で透過SIXEL出力対応を入れようと思います。 (Issueとしては分けた方が望ましいかも)

msmhrt commented 9 years ago

@saitoha さん

(Issueとしては分けた方が望ましいかも)

この Issue は元々、FireFormat.Info の画像を正常に表示して欲しいという理由から立てられた物で、その要望については既に fix-issue-25 ブランチで実現されています。

ですので fix-issue-25 ブランチが master ブランチにマージされれば、本 Issue は close されるべきだろうと思っています。

問題は、マージされて close される前に同ブランチで何らかの問題、例えば単色透過で透過色と非常によく似た色が透過色と誤判定される等の問題が万が一見つかった場合だと思いますが、Issue を分けた方が望ましいということであれば、それに従いたいと思います。

saitoha commented 9 years ago

28 を立てました。

このIssueは-Bオプションで解決可能な問題に限定して考えます。

saitoha commented 9 years ago

Issue #29 で判明した横幅が8の倍数ではない1bpp PNGが正しく読めない問題は、こちらでの対応が原因です。

saitoha commented 9 years ago

-Bオプション入ったので閉じます。