2016-05-05 6 views
0

私は被写体について何も見つかりませんでしたが、鮮やかに夢中になっていますか、またはPHPでPNG画像をスキャンして画像内の透明な位置を見つけることができますか?png画像内の回転した透明な矩形の4つの座標を見つける

たとえば、画面が透明な穴のあるテレビの画像がある場合。アルファチャンネルをスキャンすることで、透明ピクセルの最も左上の、最も右上の、最も左下の、最も右下の座標を見つけることができますか?

ないこれを行うライブラリがありますならば、私は実際に素早くチェックが、見つからなかったことを確認。..

答えて

0

はたぶん最もエレガントな解決策と私はそれを行うためのより良い方法があります確信していないが、これはのために働きます整形されたpng画像

// Returns the coordinates of a transparent rectangle in a PNG file (top left, top right, lower left, lower right 
public function getTransparentRectangleCoordinates($fileUrl) 
{ 
    define ('TRANSPARENCY_THRESHOLD', 100); // 127=fully transparent, 0=black 

    $img = @imagecreatefrompng($fileUrl); 

    if (!$img) return ('Invalid PNG Image'); 

    $coordLowestX = array(imagesx($img), ''); 
    $coordHighestX = array(0, ''); 
    $coordLowestY = array('', imagesy($img)); 
    $coordHighestY = array('', 0); 

    $minX = imagesx($img); 
    $maxX = 0; 
    $minY = imagesy($img); 
    $maxY = 0; 

    // Scanning image pixels to find transparent points 
    for ($x=0; $x < imagesx($img); ++$x) 
    { 
     for ($y=0; $y < imagesy($img); ++$y) 
     { 
      $alpha = (imagecolorat($img, $x, $y) >> 24) & 0xFF; 
      if ($alpha >= TRANSPARENCY_THRESHOLD) 
      { 
       if ($x < $coordLowestX[0]) $coordLowestX = array($x, $y); 
       if ($x > $coordHighestX[0]) $coordHighestX = array($x, $y); 
       if ($y < $coordLowestY[1]) $coordLowestY = array($x, $y); 
       if ($y >= $coordHighestY[1]) $coordHighestY = array($x, $y); 

       if ($x < $minX) $minX = $x; 
       if ($x > $maxX) $maxX = $x; 

       if ($y < $minY) $minY = $y; 
       if ($y > $maxY) $maxY = $y; 
      } 
     } 
    } 

    // This means it's a non-rotated rectangle 
    if ($coordLowestX == array($minX, $minY)) 
    { 
     $isRotated = false; 

     return array(array($minX, $minY), array($maxX, $minY), array($minX, $maxY), array($maxX, $maxY)); 
    } 
    // This means it's a rotated rectangle 
    else 
    { 
     $isRotated = true; 

     // Rotated counter-clockwise 
     if ($coordLowestX[1] < $coordHighestX[1]) 
      return array($coordLowestX, $coordLowestY, $coordHighestY, $coordHighestX); 
     else // Rotated clockwise 
      return array($coordLowestY, $coordHighestY, $coordLowestX, $coordHighestX); 
    } 
} 
関連する問題