Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Графика > Вырезание круглой картинки и наложение на другую


Автор: Secandr 19.4.2006, 16:30
Наша контора заказала дизайн у мега крутого дизайнера... Так он придумал динамически меняющмеся круглые картинки на сложном фоне. Причём эти картинки должны браться из других, квадратных.

Руками резать десятки, а то и сотни картинок влом...

Вот и решил узнать, возможно ли из центра одной картинки вырезать круг диаметром N пикселей и наложить на другую картинку.

Или взять на картинку наложить другую с прозрачным кругом в центре.

Насколько это сложно, есть ли смысл мучатся? Есть вариант заставить переделать дизайн smile 

Автор: Secandr 20.4.2006, 10:38
Код

convert 1.jpg -resize 128x128\! 128x128.gif
composite -gravity center  mask2.GIF 128x128.jpg out.jpg

1.jpg - исходная картинка
mask2.gif - картинка с прозрачностью
out.jpg - выходит картинка наложеная 

Автор: MuToGeN 22.4.2006, 05:58
C гифом - неинтересно, ибо полноценного альфа-канала нет.
Наложение с антиалиасингом (требует GD2):
Код

<?php
function mixColors($color1, $color2, $q, $returnArray = true) {
    $r1 = ($color1 >> 16) & 0xFF;
    $g1 = ($color1 >> 8) & 0xFF;
    $b1 = $color1 & 0xFF;
    $r2 = ($color2 >> 16) & 0xFF;
    $g2 = ($color2 >> 8) & 0xFF;
    $b2 = $color2 & 0xFF;
    $r = round($r1*$q + $r2*(1 - $q));
    $g = round($g1*$q + $g2*(1 - $q));
    $b = round($b1*$q + $b2*(1 - $q));
    if($returnArray)    return array($r, $g, $b);
    else                return ($r << 16) | ($g << 8) | $b;
}

function circleImage($srcIm, $dstIm, $centerX, $centerY, $radius, $blurBorderWidth = 1) {
    $rezultIm = imagecreatetruecolor(imagesx($dstIm), imagesy($dstIm));
    imagecopy($rezultIm, $dstIm, 0, 0, 0, 0, imagesx($dstIm), imagesy($dstIm));
    for($x = $centerX - $radius; $x <= $centerX + $radius; $x++)
        for($y = $centerY - $radius; $y <= $centerY + $radius; $y++) {
            $dist = sqrt(pow($x - $centerX, 2) + pow($y - $centerY, 2));
            if($dist > $radius)                            $q = 1;
            elseif($dist < $radius - $blurBorderWidth)    $q = 0;
            else                                        $q = 1 - ($radius - $dist)/$blurBorderWidth;
            $cArr = mixColors(imagecolorat($dstIm, $x, $y), imagecolorat($srcIm, $x, $y), $q);
            $color = imagecolorexact($rezultIm, $cArr[0], $cArr[1], $cArr[2]);
            if($color == -1) $color = imagecolorallocate($rezultIm, $cArr[0], $cArr[1], $cArr[2]);
            imagesetpixel($rezultIm, $x, $y, $color);
        }
    return $rezultIm;
}

header('Content-type: image/png');
$src = imagecreatefromjpeg('1.jpg');
$dst = imagecreatefromjpeg('2.jpg');
$im = circleImage($src, $dst, 200, 200, 100);
imagepng($im);
?>
 

Автор: Secandr 22.4.2006, 06:11
MuToGeN, а зачем мне альфаканал? там просто прозрачно/не прозрачно ... 

Автор: MuToGeN 22.4.2006, 06:26
С гифом края накладываемого изображения получатся неровные. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)