LoginSignup
37
33

More than 5 years have passed since last update.

PHPで画像色抽出

Posted at

社内の方も社外の方もこんばんは。2015年度新卒入社したmekkooです。
Advent Calendarの季節です。街には色があふれていますね。
僕はひたすら画面を見つめているのですが、最近感動したUIがあります。

iTunesに最近搭載された...

2015:11:16MediaLT.001.jpeg

美しい。かっこいい!
没頭できる。アルバムアートをちゃんと設定しようという気になる。
PHPで再現して、メディアに取り入れてみたい…

PHPでClassを作ってみよう!

画像色抽出どうすればいいか考えた

  • 画像をオブジェクトとして読み込んで
    • phpなら、imagecreatefrom*() 関数
  • 左上から右下へ、ピクセルを走査していく?
    • 大きな画像の場合、10px毎とかでスキップしながらでもいいかも
  • 最終的に、カラーコードの平均を取る?

実際にやってみた

<?php
class SenseOfColor
{
    private $filepath;
    public function __construct($filepath)
    {
        $this->filepath = $filepath;
    }
    public function getAverageColor()
    {
        //画像(今回はPNG)をオブジェクトとして読み込んで
        $img  = imagecreatefrompng($this->filepath);
        $imgX = imagesx($img); //ヨコと
        $imgY = imagesy($img); //タテのpx数を取得して
        $imgXY = $imgX*$imgY; //掛けあわせて
        $rSum = '';
        $gSum = '';
        $bSum = '';
        for ($y = 0; $y < $imgY; $y++) { //左上から右下にかけてfor文で走査
            for ($x = 0; $x < $imgX; $x++) {
                $rgb = imagecolorat($img, $x, $y); //rgbコードを取得して
                $r = ($rgb >> 16) & 0xFF; //赤を10進数に
                $g = ($rgb >> 8) & 0xFF; //緑を10進数に
                $b = $rgb & 0xFF; //青を10進数に
                $rSum += $r; //それぞれを合算していく...
                $gSum += $g;
                $bSum += $b;
            }
        }
        //合算された赤(R),緑(G),青(B)をそれぞれ画像の合計px数で割り、
        //再度16進数に変換した上で出力
        return '#'.dechex($rSum/$imgXY).dechex($gSum/$imgXY).dechex($bSum/$imgXY);
    }
}

class SenseOfColorFactory
{
    public static function create($filepath)
    {
        return new SenseOfColor($filepath);
    }
}

//任意のPNG画像を指定すると...
$target = SenseOfColorFactory::create('img/foobar.png');
//平均色のカラーコードを返せる
print($target->getAverageColor());

上記コードで実際にアルバムアートの色抽出をやってみる

スーベニア / スピッツ

「正夢」「春の歌」などが収録されたスピッツ屈指の名作。
もう10年前か!今年も終わる...

正夢 ---> b92b1c.png

うん、まずまずの近さ

Light Wave' 14 / V.A.

最近よく聞いている Ano(t)raks レーベルのコンピレーションアルバム。
Web上で公式に全曲配布されている!! メロウで素敵なシティ・ポップ集。
https://anotraks.bandcamp.com/album/light-wave-14-vol-3

---> 333a4e.png

素敵な感じ!

LDK Lounge Designers Killer / capsule

ネオ渋谷系の盟主 capsule の最高にかわいいアルバム。
空飛ぶ都市計画 はスタジオジブリがMVを制作したことでも話題になりました。

L.D.K Lounge Designers Killer ---> 9fbe36.png

青春が蘇る...

上3つのような単色ならうまくいくが…

BEST OF TRATTORIA YEARS / Bridge

90年代の前半に活躍していた、アコーディオン鳴り響くギターポップバンド。
カジヒデキが過去在籍していたことでも知られる。

ベスト・オブ・トラットリア・イヤーズ ---> c2951f.png

あれ?色が濃いぞ!せっかくの淡い黄色が…

`85 / Pizzicato Five

ピチカート・ファイヴが佐々木麻美子さんをボーカルに据える4人構成(なのにファイヴ)だった時代の音源の再販品。
最高のウィスパーボイスを聴いて完全な現実逃避ができる。

Pizzicato five 85 ---> faa055.png

今度は薄すぎ!

何故ならば... 平均色を取ってるだけだから、色が拮抗している状況だとうまくいかない

iTunesはもっと頭良かったよ!
今後はgetAverageColor()以外のメソッドを追加して徐々にiTunesに近づけていきたい

以上、好きな音楽紹介でした

現時刻はAdvent Calendar担当日の23:22です。

37
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
37
33