array(), 'r' => array(), 'g' => array(), 'b' => array()); $colorSums = array('rgb' => 0, 'r' => 0, 'g' => 0, 'b' => 0); for ($x = 0; $x < $w; ++$x) { for ($y = 0; $y < $h; ++$y) { $rgb = imagecolorat($resource, $x, $y); $t = ($rgb >> 24) & 0xFF; $r = ($rgb >> 16) & 0xFF; $g = ($rgb >> 8) & 0xFF; $b = $rgb & 0xFF; ++$colorcount['rgb'][($r + $g + $b) / 3]; ++$colorcount['r'][$r]; ++$colorcount['g'][$g]; ++$colorcount['b'][$b]; } } $maxColors = max(array(max($colorcount['rgb']), max($colorcount['r']), max($colorcount['g']), max($colorcount['b']))); $infoHeight = 12; $pixelsPerColorStep = (($h - 1) - $infoHeight * 2) / $maxColors; $pixelsPerColor = ($w - 1) / 256; $overlay = imagecreatetruecolor($w, $h); imagefill($overlay, 0, 0, imagecolorallocate($overlay, 0, 0, 0)); imagecopymerge($resource, $overlay, 0, 0, 0, 0, $w, $h, 80); $rColor = imagecolorallocatealpha($resource, 255, 0, 0, 80); $gColor = imagecolorallocatealpha($resource, 0, 255, 0, 80); $bColor = imagecolorallocatealpha($resource, 0, 0, 255, 80); $grayColor = imagecolorallocatealpha($resource, 255, 255, 255, 63); $points = array(0, $h - 1 - $infoHeight); for ($c = 0; $c <= 255; ++$c) { $points[] = $c * $pixelsPerColor + 1; $points[] = ($h - 1 - $infoHeight) - $colorcount['rgb'][$c] * $pixelsPerColorStep - 1; imagefilledrectangle($resource, $c * $pixelsPerColor, $h - 1 - $infoHeight, $c * ($pixelsPerColor * 2), $h - 1, imagecolorallocate($resource, $c, $c, $c)); } $points[] = $w; $points[] = $h - 1 - $infoHeight; imagefilledpolygon($resource, $points, count($points) / 2, $grayColor); for ($c = 0; $c <= 255; ++$c) { imageline( $resource, $c * $pixelsPerColor + 1, ($h - 1 - $infoHeight) - $colorcount['r'][$c] * $pixelsPerColorStep - 1, ($c - 1) * $pixelsPerColor + 1, ($h - 1 - $infoHeight) - $colorcount['r'][$c - 1] * $pixelsPerColorStep - 1, $rColor ); imagefilledrectangle($resource, $c * $pixelsPerColor, 0, $c * ($pixelsPerColor * 2), $infoHeight / 3 - 1, imagecolorallocate($resource, $c, 0, 0)); imageline( $resource, $c * $pixelsPerColor + 1, ($h - 1 - $infoHeight) - $colorcount['g'][$c] * $pixelsPerColorStep - 1, ($c - 1) * $pixelsPerColor + 1, ($h - 1 - $infoHeight) - $colorcount['g'][$c - 1] * $pixelsPerColorStep - 1, $gColor ); imagefilledrectangle($resource, $c * $pixelsPerColor, $infoHeight / 3, $c * ($pixelsPerColor * 2), ($infoHeight / 3) * 2 - 1, imagecolorallocate($resource, 0, $c, 0)); imageline( $resource, $c * $pixelsPerColor + 1, ($h - 1 - $infoHeight) - $colorcount['b'][$c] * $pixelsPerColorStep - 1, ($c - 1) * $pixelsPerColor + 1, ($h - 1 - $infoHeight) - $colorcount['b'][$c - 1] * $pixelsPerColorStep - 1, $bColor ); imagefilledrectangle($resource, $c * $pixelsPerColor, ($infoHeight / 3) * 2, $c * ($pixelsPerColor * 2), $infoHeight - 1, imagecolorallocate($resource, 0, 0, $c)); $colorSums['rgb'] += $c * $colorcount['rgb'][$c]; $colorSums['r'] += $c * $colorcount['r'][$c]; $colorSums['g'] += $c * $colorcount['g'][$c]; $colorSums['b'] += $c * $colorcount['b'][$c]; } $rgbAverage = ($colorSums['rgb'] / array_sum($colorcount['rgb'])) * $pixelsPerColor + 1; imageline($resource, $rgbAverage, $infoHeight, $rgbAverage, ($h - $infoHeight * 2) / 4, $grayColor); $rAverage = ($colorSums['r'] / array_sum($colorcount['r'])) * $pixelsPerColor + 1; imageline($resource, $rAverage, ($h - $infoHeight * 2) / 4, $rAverage, (($h - $infoHeight * 2) / 4) * 2, $rColor); $gAverage = ($colorSums['g'] / array_sum($colorcount['g'])) * $pixelsPerColor + 1; imageline($resource, $gAverage, (($h - $infoHeight * 2) / 4) * 2, $gAverage, (($h - $infoHeight * 2) / 4) * 3, $gColor); $bAverage = ($colorSums['b'] / array_sum($colorcount['b'])) * $pixelsPerColor + 1; imageline($resource, $bAverage, (($h - $infoHeight * 2) / 4) * 3, $bAverage, $h - $infoHeight - 1, $bColor); } } ?>