Исходное изображение PNG будет обрезано PHP с использованием Imagick на основе пользовательского ввода. Результатом является обрезанное изображение, которое может иметь или не иметь прозрачные пиксели. Я ищу способ определить, имеет ли обрезанное изображение прозрачность да или нет, поэтому я могу преобразовать непрозрачные PNG в JPG.Как определить, имеет ли обрезанная PNG прозрачность
Это мой код для загрузки изображения:
// Get user input
$src = $_POST['src'];
$resize = json_decode($_POST['selection_data']);
// Load image (source image has transparency)
$dst = new Imagick($src);
// Crop image (the part that will be cropped is fully opaque)
$dst->cropImage($resize->selW, $resize->selH, $resize->selX, $resize->selY);
$dst->resizeImage($resize->dstW, $resize->dstH, imagick::FILTER_CATROM, 0.9, false);
После этого, я могу проверить, альфа-канал, используя $dst->getImageAlphaChannel()
. Но это возвращает true
независимо от того, содержит ли кадрированное изображение какие-либо прозрачные пиксели, потому что он установлен при загрузке исходного изображения (с прозрачностью).
Другой способ проверить для прозрачных пикселей, смотря каждый пиксель для значения альфа малой, чем 1 *:
$alpha = false;
for ($x = 0; $x < $resize->dstW; $x++)
{
for ($y = 0; $y < $resize->dstH; $y++)
{
if ($dst->getImagePixelColor($x, $y)->getColorValue(Imagick::COLOR_ALPHA) < 1)
{
$alpha = true;
break 2;
}
}
}
Но для больших изображений (1000х1000) он принимает 30 + секунд, чтобы выполнить это, что не является идеальным.
Каков самый быстрый способ определить, имеют ли изображение какие-либо прозрачные пиксели?
*: Непрозрачные пиксели фактически возвращают значение альфа-значения 0.99999999976717 (32-битное плавание) на Debian Wheezy, на котором я сейчас тестирую.
[Аналогичный вопрос для библиотеки GD] (http://stackoverflow.com/questions/5495275/how-to-check-if-an-image-has-transparency-using-gd) – lonesomeday
Я бы посмотрел если вы можете загрузить обрезанное изображение обратно в новый экземпляр Imagick, тогда используйте 'getImageAlphaChannel()' в этом новом экземпляре. – Demonslay335
@ Demonslay335 Я пробовал, но альфа-канал сохраняется внутри изображения, поэтому загрузка изображения обратно приводит к тому же значению для альфа-канала. – Stan