Предварительный просмотр всего тела с использованием класса Minecraft - PullRequest
1 голос
/ 28 февраля 2012

Я разработал класс для Minecraft на PHP, одним из последних добавлений к функциям является предварительный просмотр скина, но у меня возникли небольшие проблемы при разработке кодов для предварительного просмотра всего тела (предварительный просмотр головы работает нормально),код, который я использую для предварительного просмотра головы, выглядит следующим образом ...

header('Content-Type: image/png');
$canvas = imagecreatetruecolor($size, $size);
$image = imagecreatefrompng($this->custom_skin($username));
imagecopyresampled($canvas, $image, 0, 0, 8, 8, $size, $size, 8, 8);
return imagepng($canvas);

https://github.com/nblackburn/minecraft/blob/master/class.minecraft.php

Любой вклад мог бы оказать огромную помощь, чтобы этот предварительный просмотр всего тела работал.

1 Ответ

2 голосов
/ 28 февраля 2012

Взгляните на этот шаблон скина http://www.minecraftwiki.net/images/5/54/Skintemplate.png

Исходя из того, что регионы должны быть:

head        x8 y8 w8 h8 
body front  x20 y20 w8 h12
arm front   x44 y20 w4 h12
leg front   x4 y20 w4 h12

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

header('Content-Type: image/png');

$scale = $size / 16;
$canvas = imagecreatetruecolor(16*$scale, 32*$scale);
$image = imagecreatefrompng($this->custom_skin($username));

imagealphablending($canvas, false);
imagesavealpha($canvas,true);
$transparent = imagecolorallocatealpha($canvas, 255, 255, 255, 127);
imagefilledrectangle($canvas, 0, 0, 16*$scale, 32*$scale, $transparent);

imagecopyresized($canvas, $image, 4*$scale,  0*$scale,  8,   8,   8*$scale,  8*$scale,  8,  8);  //head
imagecopyresized($canvas, $image, 4*$scale,  8*$scale,  20,  20,  8*$scale,  12*$scale, 8,  12); //body
imagecopyresized($canvas, $image, 0*$scale,  8*$scale,  44,  20,  4*$scale,  12*$scale, 4,  12); //arm left
imagecopyresampled($canvas, $image, 12*$scale, 8*$scale,  47,  20,  4*$scale,  12*$scale, -4,  12); //arm right (flipped)
imagecopyresized($canvas, $image, 4*$scale,  20*$scale, 4,   20,  4*$scale,  12*$scale, 4,  12); //leg left
imagecopyresampled($canvas, $image, 8*$scale,  20*$scale, 7,   20,  4*$scale,  12*$scale, -4,  12); //leg right (flipped)

return imagepng($canvas);

Выше приведено только по памяти, но оно должно указывать вам правильное направление. Вы не должны использовать imagecopyresampled при масштабировании, так как в этом случае вы хотите избежать интерполяции.

...