2014-06-27 7 views
12

Wie kann ich einen Rahmen um ein PNG-Bild hinzufügen? Immer wenn ich versuche, einen Rand unter Verwendung borderImage Funktion hinzuzufügen, die in imagick verfügbar ist, verliert es seine Transparenz, wenn es ein png Bild ist.Rahmen um png Bild hinzufügen mit imagick PHP

<?php 

$image = new Imagick(); 
$image->readImage('tux.png'); 

$image->BorderImage(new ImagickPixel("red") , 5,5); 

// send the result to the browser 
header("Content-Type: image/" . $image->getImageFormat()); 
echo $image; 

Dies ist das Originalbild:

enter image description here

und dies ist nach dem Hinzufügen einer Grenze:

enter image description here

Randfarbe wird auch auf den Hintergrund angewendet. Ich möchte dies mit Imagick tun Wie kann ich einen Rahmen auf ein transparentes Bild anwenden, ohne Transparenz zu verlieren?

+0

Sie meinen _only_ gelten Grenzlinie außerhalb des Bildes, so wird es keinen Hintergrund geben? –

Antwort

15

Wenn Sie Ergebnis wie dieses Ziel erreichen wollen:

Result Image

dann ist es. Sie können sogar zwischen Rahmen und Bild auffüllen, wenn Sie möchten!

/** Set source image location. You can use URL here **/ 
$imageLocation = 'tux.png'; 

/** Set border format **/ 
$borderWidth = 10; 

// You can use color name, hex code, rgb() or rgba() 
$borderColor = 'rgba(255, 0, 0, 1)'; 

// Padding between image and border. Set to 0 to give none 
$borderPadding = 0; 


/** Core program **/ 

// Create Imagick object for source image 
$imageSource = new Imagick($imageLocation); 

// Get image width and height, and automatically set it wider than 
// source image dimension to give space for border (and padding if set) 
$imageWidth = $imageSource->getImageWidth() + (2 * ($borderWidth + $borderPadding)); 
$imageHeight = $imageSource->getImageHeight() + (2 * ($borderWidth + $borderPadding)); 

// Create Imagick object for final image with border 
$image = new Imagick(); 

// Set image canvas 
$image->newImage($imageWidth, $imageHeight, new ImagickPixel('none') 
); 

// Create ImagickDraw object to draw border 
$border = new ImagickDraw(); 

// Set fill color to transparent 
$border->setFillColor('none'); 

// Set border format 
$border->setStrokeColor(new ImagickPixel($borderColor)); 
$border->setStrokeWidth($borderWidth); 
$border->setStrokeAntialias(false); 

// Draw border 
$border->rectangle(
    $borderWidth/2 - 1, 
    $borderWidth/2 - 1, 
    $imageWidth - (($borderWidth/2)), 
    $imageHeight - (($borderWidth/2)) 
); 

// Apply drawed border to final image 
$image->drawImage($border); 

$image->setImageFormat('png'); 

// Put source image to final image 
$image->compositeImage(
    $imageSource, Imagick::COMPOSITE_DEFAULT, 
    $borderWidth + $borderPadding, 
    $borderWidth + $borderPadding 
); 

// Prepare image and publish! 
header("Content-type: image/png"); 
echo $image; 

Ich habe diese Methode von here. Im Grunde erstellen wir einfach ein Rechteck mit transparenter Füllung und formatierten Rahmen unter Verwendung von ImagickDraw::rectangle, dann setzen wir das Bild innerhalb des Rechtecks ​​unter Verwendung von Imagick::compositeImage.

Hier ist das Ergebnis, wenn Sie $borderPadding-10 gesetzt:

Alternative Result Image

Das ist es! Hoffe es hilft :)