どこにでもいるSEの備忘録

たぶん動くと思うからリリースしようぜ

【備忘録】PNGファイルからインデックスカラーを取得する

PNGファイルから特定の色を探すことをやっていて、PNGファイルの取扱に手間取ったので、その備忘録です。

画像のデータ構造

普通の画像データ

基本的な画像のデータ構造では、画像中の各画像について光の三原色であるRGBを0 ~ 255の間の数で表現することで画像を表現します。 RGBに加えて透過率を加えた4次元のベクトルによって各画素が表現されることになります。 イメージはこんな感じです。

f:id:nogawanogawa:20181202142402j:plain:w500

実際のデータを見てみると見るとこんな感じです。

PNG(.png)

今回対象になっているPNGファイルでは、ビットマップの形式からデータ量を圧縮されています。 圧縮の中身ですが、PNGでは"カラーパレット"と呼ばれる、画像に使用できる色のリストを保持しています。 そしてカラーパレットの通し番号を使用することで、各画素の色を表現しています。

イメージとしてはこんな感じです。

f:id:nogawanogawa:20181202142624j:plain:w550

こちらも実際に眺めて見るとこんな感じです。

Pillow

今回はカラーパレットの中身を見たり操作したりするために、Pillow (PIL)を使用します。

https://pillow.readthedocs.io/en/4.1.x/index.html

実際にやってみる

実際にやってみたいと思います。 こちらの画像で試しにやってみたいと思います。

f:id:nogawanogawa:20181202151521p:plain:w300

試しにいくつかの色を抽出してみます。

こんな感じにPNGファイルの特定の色を抽出できました。

感想

画像もちゃんと勉強してみると奥が深いですね。 他にも画像の圧縮形式はありますので、機会があったらそのうち勉強したいと思います。