2013-03-23 2 views
10

Я делаю аватары с помощью PHP GD. Там есть раздражающее пространство между ногами аватара и нижней частью изображения. Я хочу, возможно, избавиться от этого пространства, «нажав» аватар вниз (см. Ниже).Перемещение изображения внизу

Вот исходное изображение, что мне не нравится, наряду с изображением я хочу получить:

enter image description here

Есть ли способ это? Благодарю. Ниже приведена основная часть кода, используемого для генерации изображений.

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

Примечание: if($_GET['x']) { часть этого кода, чтобы позволить мне создавать различные размеры аватара на месте. Он работает нормально.

+0

Это трудно понять ваш вопрос, но почему бы не уменьшить высоту агитировать на на пиксель? –

+0

Обновлен w/pictures и лучшее объяснение. Я ужасно объясняю вещи. Сожалею. :( – Anonymous

+0

@BenD Я не могу изменить размер изображения, и это связано с тем, что пользователь может добавить набор туфель или что-то, что будет использовать это пространство. – Anonymous

ответ

3

Вот код для обрезки дна и перемещения обрезанного изображения снизу.

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

Ссылки:

2

Я думаю, что решение состоит в том, чтобы создать аватар снизу вверх. то есть обувь -> тяжелое дыхание -> рубашка -> лицо -> волосы

(псевдокод)

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 

Если посмотреть на метод imagecopy он имеет метод следующую подпись

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) 

Изменяя $dst_x и $dst_y, вы могли бы достичь того, что я описал.

+0

Это беспокоит, потому что обувь может иметь разную высоту. Любые предложения для этого? – Anonymous

+0

Используйте getimagesize(), чтобы динамически находить высоту или изменять массив активов вложенный хеш, который имеет все необходимые параметры. – Josnidhin

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