<?php
/**
imagecolorat — ピクセルのカラー インデックス値を取得する
int imagecolorat ( resource $image , int $x , int $y )
image で指定されたグラフィック内の指定された位置にあるピクセルのカラー インデックス値を返します。
PHP が GD ライブラリ 2.0 以降でコンパイルされており、イメージがトゥルーカラー イメージである場合、この関数はポイントの RGB 値を整数として返します。シフトとマスキングを使用して、赤、緑、青のコンポーネントの値を取得します。
*/
//echo dechex(255);die;//ff 16 進数 ff = 10 進数 255
ini_set('display_errors', 'オン');
error_reporting(E_ALL | E_STRICT);//E_ALL: E_STRICT を除くすべてのエラーおよび警告情報
//E_STRICT: コードの最高の相互運用性と上位互換性を確保するために、PHP によるコード変更の提案を有効にします。
$im = ImageCreateFromPng("images/4.png");
//$rgb = ImageColorAt($im, 100, 100);
//シフト操作の説明 https://my.oschina.net/u/435872/blog/134802,
//n ビットを左にシフトすることは、データを 2 の n 乗で乗算することを意味し、n ビットを右にシフトすることは、データを 2 の n 乗で割ってから丸めることを意味します。
//print_r(decbin($rgb));//$rgb = 15326445 をバイナリ 111010011101110011101101 に変換
//エコー $rgb >> 16;//233 15326445/2^16 = 233.862991333
//echo decbin($rgb >> 16);//11101001 $rgb のバイナリ値を右に 16 シフトし、余分な部分を削除して取得します
//$r = ($rgb >> 16) & 0xFF;
//$g = ($rgb >> 8) & 0xFF;
//$b = $rgb & 0xFF;
関数平均($img) {
$w = 画像x($img);
$h = 画像sy($img);
$r = $g = $b = 0;
for($y = 0; $y < $h; $y++) {
for($x = 0; $x < $w; $x++) {
//色表現とビット演算 http://www.cnblogs.com/mengdd/p/3254292.html
$rgb = imagecolorat($img, $x, $y);
$r += $rgb >16;
$g += $rgb >> 8 & 255;
$b += $rgb & 255;
}
}
$pxls = $w * $h;
$r = dechex(round($r / $pxls));
$g = dechex(round($g / $pxls));
$b = dechex(round($b / $pxls));
if(strlen($r) < 2) {
$r = 0 。
}
if(strlen($g) < 2) {
$g = 0 。
}
if(strlen($b) < 2) {
$b = 0 。
}
$r . $b を返します。
}
print_r(平均($im));
このコード
$r += $rgb >> 16;
$g += $rgb >> 8&255;
$b += $rgb & 255;
理解できないのは、シフト後にビットと 255 の演算が必要な理由です。
(mask & 0xff)
目的在于消除mask
結果が0〜255の範囲内になるように8桁以上の上位データを入力してください$rgb が
の場合0x111111
你又不& 255
,结果会是$g = 0x1111
$b=0x111111