Перемещение изображения вниз

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

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

  введите здесь описание изображения

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

$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']) { этого кода позволяет мне создавать различные размеры аватара на месте. Это работает нормально.


person Anonymous    schedule 23.03.2013    source источник
comment
Трудно понять ваш вопрос, но почему бы не уменьшить высоту холста на один пиксель?   -  person Ben D    schedule 23.03.2013
comment
Обновлено с картинками и лучшим объяснением. Я ужасно объясняю вещи. Прости. :(   -  person Anonymous    schedule 23.03.2013
comment
@BenD Я не могу изменить размер изображения, и это связано с тем, что пользователь может добавить комплект обуви или что-то еще, что займет это пространство.   -  person Anonymous    schedule 23.03.2013
comment
пожалуйста, также предоставьте изображения - возможно, ссылку на почтовый индекс - чтобы можно было попробовать код. не то, чтобы вы тратите впустую свою с трудом заработанную щедрость.   -  person hakre    schedule 01.10.2013


Ответы (2)


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

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

Использованная литература:

person Rully Hendrawan    schedule 03.10.2013

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

(псевдокод)

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, вы можете добиться того, что я описал.

person Josnidhin    schedule 30.09.2013
comment
Это беспокоит, потому что обувь может быть разной высоты. Любые предложения для этого? - person Anonymous; 30.09.2013
comment
Используйте getimagesize() для динамического определения высоты или измените массив ресурсов на вложенный хеш, который имеет все необходимые параметры. - person Josnidhin; 30.09.2013