Найти 4 координаты повернутого прозрачного прямоугольника в изображении png

Я ничего не нашел в этом предмете, но я живо мечтаю или в PHP возможно отсканировать изображение в формате PNG и найти прозрачные позиции на картинке?

например, если есть изображение телевизора с прозрачным отверстием, где находится экран. Могу ли я найти самые верхние левые, самые верхние правые, самые нижние левые, самые нижние правые координаты прозрачных пикселей путем сканирования альфа-канала?

Не уверен, что если библиотека делает это, я проверил очень быстро, но не нашел ..

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);
}
}
0

Другие решения

Других решений пока нет …