2013-03-23 10 views
10

Ich mache Avatare mit PHP GD. Zwischen den Füßen des Avatars und dem unteren Rand des Bildes ist lästiger Platz. Ich möchte diesen Raum möglicherweise durch "Schieben" des Avatars nach unten beseitigen (siehe unten).Verschieben eines Bildes nach unten

Hier ist das Original-Bild, das Ich mag es nicht, neben dem Bild, das ich zu bekommen:

enter image description here

Gibt es eine Methode, um das? Vielen Dank. Unten ist der Hauptteil des Codes, der für die Bilderzeugung verwendet wird.

$assets = array(
    "../assets/shirt/Default.png", 
    "../assets/body/Default.png", 
    "../assets/hair/Default.png", 
    "../assets/eyes/Default.png", 
    "../assets/eyebrows/Default.png", 
    "../assets/mouth/Default.png", 
    "../assets/pants/Default.png" 
); 

$baseImage = imagecreatefrompng($assets[0]); 
imagealphablending($baseImage, true); 
imagesavealpha($baseImage, true); 

foreach($assets as $item) { 
    $newImage = imagecreatefrompng($item); 
    imagecopy($baseImage, $newImage, 0, 0, 0, 0, 350, 550); 

    imagealphablending($baseImage, true); 
    imagesavealpha($baseImage, true); 
} 

if($_GET['x']) { 

    $sizex = $_GET['x']; if($sizex > 350) $sizex = 350; 
    $sizey = $_GET['y']; if($sizey > 550) $sizey = 550; 

    $png = imagecreatetruecolor($sizex, $sizey); 
    imagesavealpha($png, true); 

    $trans_colour = imagecolorallocatealpha($png, 0, 0, 0, 127); 
    imagefill($png, 0, 0, $trans_colour); 

    $blankImage = $png; 
    imagealphablending($blankImage, true); 
    imagesavealpha($blankImage, true); 

    imagecopyresampled($blankImage, $baseImage, 0, 0, 0, 0, $sizex, $sizey, 350, 550); 

    header("Content-type: image/png"); 
    imagepng($blankImage); 
} 
else { 
    header("Content-type: image/png"); 
    imagepng($baseImage); 
} 

Hinweis: Der if($_GET['x']) { Teil dieses Codes ist mir zu erlauben, verschiedene Größen des Avatars an Ort und Stelle zu erzeugen. Es funktioniert gut.

+0

Es ist schwierig, Ihre Frage zu verstehen, aber warum die canvass Höhe von auf Pixel nicht reduzieren? –

+0

Aktualisiert w/Bilder und bessere Erklärung. Ich bin schrecklich darin, Dinge zu erklären. Es tut uns leid. :( – Anonymous

+0

@BenD Ich kann die Größe des Bildes nicht ändern, und das ist aufgrund der Tatsache, dass der Benutzer eine Reihe von Schuhen oder etwas hinzufügen kann, die diesen Raum verbrauchen würde. – Anonymous

Antwort

3

Hier ist der Code zum Zuschneiden des Bodens und zum Verschieben des zugeschnittenen Bildes nach unten.

<?php 
example(); 
function example(){ 
    $img = imagecreatefrompng('http://i.stack.imgur.com/UUiMK.png'); 
    imagealphablending($img, true); 
    imagesavealpha($img, true); 

    // copy cropped portion 
    $img2 = imageCropBottom($img); 

    // output cropped image to the browser 
    header('Content-Type: image/png'); 
    imagepng($img2); 

    imagedestroy($img2); 
} 

function imageCropBottom($image) { 
    $background1 = imagecolorat($image, 0, 0); 
    $background2 = imagecolorat($image, 1, 1); 

    $imageWidth = imageSX($image); 
    $imageHeight = imageSY($image); 
    $bottom = 0; 

    for ($y = $imageHeight ; $y > 0 ; $y--) { 
     for ($x = 0 ; $x < imagesx($image) ; $x++) { 

      $imageColor = imagecolorat($image, $x, $y); 
      if (($imageColor != $background1) && ($imageColor != $background2)) { 
       $bottom = $y; 
       break; 
      } 
     } 
     if ($bottom > 0) break; 
    } 

    $bottom++; 

    // create new image with padding 
    $img = imagecreatetruecolor($imageWidth, $imageHeight); 
    imagealphablending($img, true); 
    imagesavealpha($img, true); 

    $trans_colour = imagecolorallocatealpha($img, 0, 0, 0, 127); 
    imagefill($img, 0, 0, $trans_colour); 

    // copy 
    imagecopy($img, $image, 1, $imageHeight-$bottom, 1, 1, $imageWidth-2, $bottom-1); 

    // Draw a black rectangle 
    $black = imagecolorallocate($img, 0, 0, 0); 
    imagerectangle($img, 0, 0, $imageWidth-1, $imageHeight-1, $black); 


    // destroy old image cursor 
    imagedestroy($image); 
    return $img; 
} 

Referenzen:

2

Ich denke, die Lösung ist, den Avatar in einer Bottom-up-Mode zu bauen. dh Schuh -> Hose -> Hemd -> Gesicht -> Haare

(Pseudocode)

position = (x,y) // where y is the height of the canvas initially 
if(need(shoe)){ 
    position = position - shoe.height 
    add shoe at position 
} 
if(need(pant)) { 
    position = position - pant.height 
    add pant at position 
} 
... and so on 

Wenn man sich die Imagecopy Methode sehen sie die folgende Methode Signatur

bool imagecopy (resource $dst_im , resource $src_im , int $dst_x , int $dst_y , int $src_x , int $src_y , int $src_w , int $src_h) 

Indem Sie $dst_x und $dst_y ändern, können Sie erreichen, was ich beschrieben habe.

+0

Es ist jedoch beunruhigend, weil Schuhe unterschiedliche Höhen haben können.Alle Vorschläge dafür? – Anonymous

+0

Benutze getimagesize(), um die Höhe dynamisch zu finden oder das Assets-Array zu ändern in geschachtelten Hash, der alle notwendigen Parameter hat. – Josnidhin