10

PHPGDでアバターを作成しています。アバターの足と画像の下部の間に迷惑なスペースがあります。アバターを一番下まで「押す」ことで、そのスペースをなくしたいと思います(以下を参照)。

取得したい画像と一緒に、私が気に入らない元の画像を次に示します。

ここに画像の説明を入力してください

これには方法がありますか?ありがとう。以下は、画像生成に使用されるコードの主要部分です。

$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']) {そのコードの一部は、さまざまなサイズのアバターをその場で生成できるようにすることです。正常に動作します。

4

2 に答える 2

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

参照:

于 2013-10-03T11:48:18.223 に答える
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あなたは私が説明したことを達成することができました。

于 2013-09-30T03:55:51.070 に答える