プログラムでMinecraftのスキンから頭だけを抜き出す方法
2018/04/07
運営するサーバーのサイトにユーザーのスキンを表示したい、なんて需要はあるでしょう。
で、それの手法とか。具体的には顔の部分だけトリミングする方法です。
スポンサーリンク
顔画像を抜き出す
スキンの取得方法
前までは「http://skins.minecraft.net/MinecraftSkins/<ユーザ名>.png」が使えたんですけどね、なくなったみたいで……。
スキン画像の取得は他に記事にパスしましょう。(書き直す暇がないので)
ちなみになんですけど、「スキンを取得するプログラム」は別で切り分けて作成(APIとして呼び出せるように)した方が使い勝手良いですよ。
顔の部分を抜き出す
新旧どちらのスキンタイプを問わず、ユーザの頭はx=8px,y=8pxから始まり、そこから縦横8pxの大きさとなっています。
髪飾りを抜き出す
こちらはお好みでどうぞ、開始地点がx=40になった以外は頭と全く同じです。
切り出した髪飾りを、先程作成した頭に重ね合わせると髪飾り付きのスキンが出来上がりです。
拡大する
このままでは8px*8pxのスキンが出来上がりだけです。(CSSで大きさを500%とかに指定して拡大してもボヤけます)
顔画像として使うなら48px(6倍)が使い勝手良いかと……
例
言うだけならばエベレストの登頂だって出来てしまうのです。
例示のコードです。cURLとGDを使ってます。
<?php
/* -- スキン画像を取得するコードは省略 -- */
// $image = スキン画像;
$size = 48;
// 画像加工
$skin = imagecreatefromstring($image);
$head = ImageCreateTrueColor($size, $size);
// 頭を抜き出す
$tmp = imagecrop($skin, array('x' => 8, 'y' => 8, 'width' => 8, 'height' => 8,));
// 髪飾りを重ねる
imagecopy($tmp, $skin, 0, 0, 40, 8, 8, 8);
// 拡大する
ImageCopyResized($head,$tmp,0,0,0,0,$size,$size,8,8);
// 出力をバッファリングして取得(GDはバイナリ出力出来ない)
// ETagとかキャッシュが不要ならそのまま出力しても可
ob_start();
imagepng($head,NULL,9);
$image = ob_get_clean();
//メモリから画像を破棄
imagedestroy($skin);
imagedestroy($tmp);
imagedestroy($head);
// キャッシュしたり、ETagを計算したり……
// 出力
header("Content-type: image/png");
echo $image;
これをサーバにアップロードして、<img>で参照するだけ、簡単。