「ゲームプログラミング/画像ファイルの作成プログラム」の版間の差分

削除された内容 追加された内容
→‎PNGフォーマット: CRCは巡回冗長検査だったので訂正
→‎PNGフォーマット: 出典として GREEのサイトを追加。ついでに出典サイトなどで勉強した内容を当wiki用に追記。
847 行
 
PNGは圧縮ライブラリにオープンソースの圧縮伸張ライブラリ ZLIB を採用しています。なので、ZLIB を調べなければなりません。
 
 
PNGについて、企業 GREE の技術者ブログが詳しくわかりやすくまとまっています。 [https://labs.gree.jp/blog/2012/11/5373/ 『PNG軽量化の減色と圧縮について | エンジニアブログ | GREE Engineering』]
 
詳しくは、そちらを読んでください。当wikiよりも遥かにレベルの高い技術者がわかりやすく解説してくれています。
 
いちおう、当wiki側で念のためにある程度は技術解説しておくと(リンク先サイトが将来的に消失するような場合もあるので念のため)、
zlib自体は統一的に普及していますが、しかしPNGの圧縮はzlibだけによるものではなく、フィルタやパレットによる圧縮の効果もあります。
 
このため、どういったアルゴリズムを採用するかによって圧縮率が変わるので、実はPNGには統一的な圧縮方法がなく、ソフトウェアやアルゴリズムによって変わります。だから代表的なPNG編集可能ソフトウェアでは、さまざまなパターンの圧縮方法を試して、一番圧縮率の高かったものを採用するとのことです。
 
こういう複雑な仕様のため、個人でPNG編集ソフトウェアを作るのは、あまり現実的ではないでしょう。企業やベンチャーなどに任せましょう。
 
 
なお、パレットは256色までです。このため、PNG画像であまり多くの色を使うのは、あまり良作とはいえないかもしれません。アニメ風の一見すると色の少ない塗りの絵でも、昨今のアニメ風イラストでは加工処理などによって色数が増えている場合もあるので、果たしてそれが256色以内に収まるかどうか、やや疑問です。
 
ただし、256色以上になっていてパレットが使えなくても、PNGには別段落で述べるハフマン符号などによる圧縮もありますので、ビットマップよりかは少なくなります。
 
 
また、PNGには、画像の行ごとに「フィルタ」と言う処理があり・・・(調査中)
 
 
PNGはハフマン符号と言うのを使っています。これは、出現頻度の多い文字にほど、短い文字を割り当てるものです。ただし、1バイト単位で文字と見なして、それを符号化するようです。
 
ハフマン符号は、情報工学系の大学教科書などで一般的な『符号理論』のような科目の教科書で解説される、典型的な技術です。
 
 
PNGは、このほか LZSS という処理を使っています。
 
LZSS とハフマン符号を組み合わせたものが、PNGの採用している Deflate 圧縮です。
 
そして、このDeflate圧縮に補助的に色々なものをつけてライブラリ化したものが ZLIB です。