2013-03-23 24 views
10

Sto creando avatar con PHP GD. C'è uno spazio fastidioso tra i piedi dell'avatar e la parte inferiore dell'immagine. Voglio possibilmente liberarmi di quello spazio "spingendo" l'avatar verso il basso (vedi sotto).Spostamento di un'immagine in basso

Ecco l'immagine originale che non mi piace, a fianco l'immagine che voglio ottenere:

enter image description here

Esiste un metodo per questo? Grazie. Di seguito è riportata la parte principale del codice utilizzato per la generazione di immagini.

$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); 
} 

Nota: La if($_GET['x']) { parte di quel codice è quello di permettere a me di generare diverse dimensioni del avatar sul posto. Funziona bene.

+0

è difficile da capire la tua domanda, ma perché non ridurre l'altezza tela da pixel? –

+0

Aggiornato con immagini e spiegazione migliore. Sono terribile nello spiegare le cose. Scusate. :( – Anonymous

+0

@BenD Non riesco a ridimensionare l'immagine, e questo è dovuto al fatto che l'utente può aggiungere un set di scarpe o qualcosa che userebbe questo spazio. – Anonymous

risposta

3

Ecco il codice per ritagliare il fondo e spostare l'immagine ritagliata in basso.

<?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; 
} 

Riferimenti:

2

Penso che la soluzione sia costruire l'avatar in modo bottom-up. cioè shoe -> pant -> Camicia -> faccia -> capelli

(pseudo-codice)

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 

Se si guarda il metodo imagecopy ha metodo la seguente firma

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) 

Variando $dst_x e $dst_y potresti ottenere ciò che ho descritto.

+0

Tuttavia, è preoccupante, perché le scarpe possono essere di altezze diverse.Qualsiasi suggerimento per questo? – Anonymous

+0

Usa getimagesize() per trovare l'altezza in modo dinamico o modificare l'array di risorse in un hash annidato che ha tutti i parametri necessari. – Josnidhin

Problemi correlati