PHP GD: Bir alfa miktar öğrenmek için ihtiyaç

0 Cevap php

Bu düşünün. Ben renkli (255,0,0) [kırmızı] bir pikseli var. * Alfa ile beyaz renk ile üzerinde boyalı yok birisi. Ben bunu üzerine boyanmış ne renk ile biliyorum, arka plan rengini biliyorum, ben üzerinde boyalı renk alfa almak gerekiyor. Nasıl?

Şimdiye kadar biz var:

$im = imagecreatefrompng('public/images/bg-tmp.png');

// we need to find a nearest match for this array in every pixel
/*$colors = array(
    array(255, 255, 255, 100),
    array(255, 255, 255, 75),
    array(255, 255, 255, 50),
 array(255, 255, 255, 25),
    array(255, 255, 255, 0),
);*/

// finding out the pixel color
$rgb = imagecolorat($im, 0, 6);

$r  = ($rgb >> 16) & 0xFF;
$g  = ($rgb >> 8) & 0xFF;
$b  = $rgb & 0xFF;

var_dump($r, $g, $b);

Tamam. Yani bir ilerleme.

$im = imagecreatefrompng('public/images/bg-tmp.png');

$pixels = array();

for($y = 0; $y < 24; $y++)
{
 for($x = 0; $x < 24; $x++)
 {
  $rgb  = imagecolorat($im, $x, $y);

// first three RGB values are background colors $pixels[] = array($x, $y, calc_alpha_diff(0, 0, 0, ($rgb >> 16) & 0xFF, ($rgb >> 8) & 0xFF, $rgb & 0xFF)); } }

function calc_alpha_diff($R1,$G1,$B1,$R2,$G2,$B2)
{
 $color_diff = max($R1,$R2) - min($R1,$R2) + max($G1,$G2) - min($G1,$G2) + max($B1,$B2) - min($B1,$B2);

 $array  = array
 (
  100 => 510, // 1
  75 => 382, // 0.75
  50 => 256, // 0.5
  25 => 128, // 0.25
  0 => 0 // 0
 );

 // find the nearest value
 foreach($array as $key => $val)
 {
  $delta = abs($val - $color_diff);

  if(!isset($min_delta) || $min_delta > $delta)
  {
   $min_delta = $delta;
   $alpha  = $key;
  }
 }

 return $alpha;
}

$im  = imagecreatetruecolor(24, 24);

foreach($pixels as $p)
{
 if($p[2] != 0)
 {
  imagesetpixel($im, $p[0], $p[1], imagecolorallocatealpha($im, 255, 0, 0, $p[2]));
 }
}

// make image transperant
imagecolortransparent($im, 0);

imagepng($im);
imagedestroy($im);

header('Content-type: image/png');

exit;

Bu kod size bir ~ iyi bir sonuç verecektir. Yeterince Ancak, iyi değil. Iyileştirmeler tavsiye edin.

0 Cevap