2010-11-15 3 views
2

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

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

Возможно ли это сделать и какие команды для этого есть, если они есть?

Обновление: Спасибо за помощь в этом. Это было какое-то время назад, и я забыл, но если кто-то перекрестит этот вопрос, чтобы найти решение, просто зайдите сюда: http://www.pc-siete.g6.cz/galery.html. Я сделал функции для градиента, радиального градиента, а также для закругленных углов, поэтому не стесняйтесь использовать :). Я не использую его на своем веб-сайте, но хорошо, чтобы они были подготовлены.

По какой-то причине в загруженном файле было только объявление. Теперь он хранится внутри zip и загружается должным образом.

+0

Создать дугу, используя [imagearc] (http://php.net/manual/en/ function.imagearc.php). См. Пример, он округлен. :-) – zod

+0

uhm .. не совсем то, что я искал. Я не хочу рисовать круги: DI нужно разрезать углы какого-то омага на закругленные, и оставить фон прозрачным;) – Raven

ответ

2

Насколько я знаю, для этого нет встроенной функции. Однако вы можете создать их самостоятельно в следующих направлениях:

function imageapplyroundedcorners(&$img,$radius) { 
    // for each corner 
     // loop through pixels between corner and (corner +- radius) 
      // if distance between pixel and radius > radius, make transparent 
      // elseif distance > radius-1 make partially transparent (for antialiasing) 
} 
+0

, который мог бы работать на самом деле, но это своего рода решение bruteforce .. во всяком случае, если ничего другого не появится, я попробую что один;) – Raven

+0

У меня есть (неудачная) тенденция идти с решениями грубой силы сначала, а затем проработать легкий путь XD Итак, да, это сработает (и я могу написать код, чтобы он скоро использовал меня) но есть вероятность, что существует более эффективное решение (но есть ли у него сглаживание?) –

+0

Я сомневаюсь, что теперь я смотрю некоторые функции ImageMagick, упомянутые там, но все, кажется, экспериментальные, не документированные, и у людей возникают проблемы с ними:/Похоже, до тех пор, пока у нас не будет достойных инструментов, нам нужно пойти на брутфорс;) – Raven

1

Я только что создал эту функцию, используя ImageMagick в PHP, которая делает именно то, что я хотел. Вам необходимо установить константу TEMP_DIR и выполнить исполняемый файл convert на пути выполнения.

function png_corners($image, $r = 12) 
{ 
    //Dump out the image as a PNG file. 
    $tmp_file = tempnam(TEMP_DIR, "image") . ".png"; 
    imagepng($image, $tmp_file); 

    //Final image file. 
    $tmp_out_file = tempnam(TEMP_DIR, "out") . ".png"; 

    $x = imagesx($image); 
    $y = imagesy($image); 

    $cmd = "convert -size {$x}x{$y} xc:none -fill white -draw 'roundRectangle 0,0, {$x} ,{$y}, {$r}, {$r}' {$tmp_file} -compose SrcIn -composite {$tmp_out_file}"; 
    exec($cmd); 

    header("Content-Type: image/png"); 
    $contents = file_get_contents($tmp_out_file); 
    echo $contents; 
    exit; 
} 
+0

ну этот был довольно старый, но nwm, возможно, кто-то ищет воображаемого, найдет то, что ему нужно. – Raven

1

Вместо того, чтобы пытаться изобрести колесо использовать PHP thumbnailer, который сделает все для вас:

require 'Thumbnailer.php'; 

$th=new Thumbnailer("photo.jpg"); 
$th->thumbFixed(120,90)->round()->save("thumb.jpg"); 
+0

1. long назад ответил 2. Если бы кто-то не стал «изобретать», что на самом деле просто понимает, как что-то делать, когда умирает старое поколение, не будет никого, кто мог бы продвигаться вперед, и ЭТО было бы реально изобретать. – Raven

Смежные вопросы