Проверьте, если изображение белое;если это так, сделайте прозрачным - PullRequest
2 голосов
/ 15 октября 2011

У меня есть изображение, и я хочу сделать его прозрачным, если оно полностью белое. У меня уже есть следующий код для GD для получения части изображения:

$srcp = imagecreatefrompng("../images/".$_GET['b'].".png");
$destp = imagecreate(150, 150);
imagecopyresampled($destp, $srcp, 0, 0, 40, 8, 150, 150, 8, 8);
header('Content-type: image/png');
imagepng($destp);

Но как я могу сначала проверить, полностью ли белое изображение, если это так, измените его на прозрачный и примените это к $destp?

Ответы [ 3 ]

4 голосов
/ 15 октября 2011

РЕДАКТИРОВАТЬ:

Исходя из перечитывания вопроса и обсуждения ниже, я считаю, что это то, что вы ищете:

$width = 150;
$height = 150;

$srcp = imagecreatefrompng("../images/".$_GET['b'].".png");
$destp = imagecreatetruecolor(150, 150);

$white = 0;

for ($y = 0; $y < $height; $y++)
{
    for ($x = 0; $x < $width; $x++)
    {
        $currentColor = imagecolorat($srcp, $x, $y);
        $colorParts = imagecolorsforindex($srcp, $currentColor);

        if (($colorParts['red'] == 255 &&
            $colorParts['green'] == 255 &&
            $colorParts['blue'] == 255))
        {
            $white++;
        }
    }
}

if ($white == ($width * $height))
{
    imagecopyresampled($destp, $srcp, 0, 0, 40, 8, 150, 150, 8, 8);
}
else
{
    imagesavealpha($destp, true);
    imagefill($destp, 0, 0, imagecolorallocatealpha($destp, 0, 0, 0, 127));
}

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

Это дает чистое изображение, если срез 8x8 исходного изображения полностью белый, в противном случае он сэмплирует срез 8x8 до 150x150.


Оригинал:

У меня нет 'Я никогда не делал ничего с PHP GD раньше, и думал, что это будет весело.Вот как я это сделал:

$filename = 'test.png'; // input image
$image = imagecreatefrompng($filename);

// grab the input image's size
$size = getimagesize($filename);
$width = $size[0];
$height = $size[1];

$newImage = imagecreatetruecolor($width, $height);

// make sure that the image will retain alpha when saved
imagesavealpha($newImage, true);
// fill with transparent pixels first or else you'll
// get black instead of transparent
imagefill($newImage, 0, 0, imagecolorallocatealpha($newImage, 0, 0, 0, 127));

// loop through all the pixels
for ($y = 0; $y < $height; $y++)
{
    for ($x = 0; $x < $width; $x++)
    {
        // get the current pixel's colour
        $currentColor = imagecolorat($image, $x, $y);

        // then break it into easily parsed bits
        $colorParts = imagecolorsforindex($image, $currentColor);

        // if it's NOT white
        if (!($colorParts['red'] == 255 &&
            $colorParts['green'] == 255 &&
            $colorParts['blue'] == 255))
        {
            // then keep the same colour
            imagesetpixel($newImage, $x, $y, $currentColor);
        }
    }
}

// final output, the second arg is the filename
imagepng($newImage, 'newImage.png');

Это позволило мне превратить это:

Test image before processing

В это (трудно увидеть альфу здесь,но вы можете открыть его, чтобы увидеть):

Image after processing

0 голосов
/ 15 октября 2011

После быстрого просмотра страниц справочника GD, я думаю, что для вас должно работать следующее (в любом случае это работало на моем тестовом сервере):

<?php
// Create image instance
$im = imagecreatefromgif('test.gif');
if (imagecolorstotal($im) == 1) {

    $rgb = imagecolorat($im, 1, 1); // feel free to test any pixel, but if they're all
                                    // the same colour, then it shouldn't really matter
    $colors = imagecolorsforindex($im, $rgb);

    if ($colors['red'] == 255 && $colors['green'] == 255 && $colors['blue'] == 255) {
        // I'm ignoring $colors['alpha'] but that's optional.
        echo "Yup; it's white...";
    }
} else {
    // if you've got more than one colour then the image has to be at least
    // two colours, so not really worth checking if any pixels are white
}

// Free image
imagedestroy($im);
?>

Ссылки:

0 голосов
/ 15 октября 2011

Простое простое решение - использовать imagecolorat и выполнять итерацию по всем пикселям png, а если все они белые, изменить его на прозрачный.

Надеюсь, это поможет.

...