雑念日記

主に技術的なことをつらとらと(書ければいいな)。

PNG画像の破壊に挑戦してみた

前回の記事を投稿したところ、記事を読んで下さった方からグリッチ画像というジャンルがあるということを教えていただきました

簡単に言うと画像データの一部をわざと破壊することで、ノイズが入ってアートっぽくなって面白い!という感じ?

調べてみるとJPEGは結構グリッチ画像を作ってる人がいていろいろ出てきたのですが、PNGはあまり情報がない。PNGの場合、単純に画像データを壊しただけでは表示できなくなってしまうみたいです。

たぶんだけど、画像データとCRCとの整合がとれなくなってしまうからだろうなあ。おそらく一般的な画像ビューワではチャンクのCRCのチェックをして画像がバグってないか確認した上でPNGを表示するつくりになっていると思うので、単純に画像データをちょこっと弄るだけじゃだめなんだろうと思います。

なんでJPEGはOKなのか、みたいなのは別の機会に調べたいですねー。チェックサムみたいなのがないのでしょうか?

で、PNGグリッチを探してみたらありました。しかも日本語情報で嬉しい。
PNGグリッチ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

この方は画像データそのものは変更せず、フィルターを変更することでバグらせてるらしいです。*1

これを参考に、というかまんま同じことをしようと思い、前回のPNG表示のコードを少し変えてPNGグリッチ画像ジェネレータにしてみました。

ソースコードはこちら→ Glitch PNG Generator/Displayer · GitHub

例によって単純なPNGにしか対応していないので、うまく動かない場合もあります。

入力したPNG画像のグリッチを一定間隔で変化させながらファイルに吐きつつ表示します。
以下は実行中の様子。

実行中表示された画像は全部ファイルに吐き出してくれるので、実行後dataディレクトリはこんな感じになります。

f:id:hoshi_sano:20130822002534p:plain

パラメータを変更することで、どのフィルターがどの程度の割合と頻度で適用されるかを調整できます。
単一のフィルターのみを適用することも可能です。

Subフィルターのみ

f:id:hoshi_sano:20130822002552p:plain

Upフィルターのみ

f:id:hoshi_sano:20130822002604p:plain

Averageフィルターのみ

f:id:hoshi_sano:20130822002617p:plain

Paethフィルターのみ

f:id:hoshi_sano:20130822002631p:plain

Average と Paeth がキレイですねー。

まとめ

  • PNGの場合、フィルターを破壊することでわりと簡単にグリッチができる。
    • 破壊した、というよりは整合性を気にしつつズラした、みたいな感じ。
  • フィルターの特性がそのままグリッチ画像にあらわれて面白い。
  • 上の面白さとは表裏一体だけど、フィルターの破壊だけだと画像のバグり方が限られる。
  • かといって、PNGの構造上もっとダイナミックにバグらせるのは結構骨が折れる。
  • なんかいい案ありませんかね?

おまけ

出力画像の綺麗さは気にしてましたが、グリッチという概念としての美しさは気にしてませんでした...。
奥が深いっす...!

*1:フィルターについてはこの記事を参照。