3

私は頭をバッシングしてきました。

// ....all prev code is fine.... 
$pasteboard =imagecreatetruecolor($imgs['bg']["width"],$imgs['bg']["height"]);
imagealphablending($pasteboard, false);
imagecopyresampled($pasteboard, $imgs['bg']["img"],0,0,0,0,$imgs['bg']["width"],$imgs['bg']["width"],imagesx($imgs['bg']["img"]),imagesy($imgs['bg']["img"]));
imagecopyresampled($pasteboard, $imgs['photo']["img"],20,20,0,0,$imgs['photo']["width"],$imgs['photo']["width"],imagesx($imgs['photo']["img"]),imagesy($imgs['photo']["img"]));
imagesavealpha($pasteboard,true);
//send it out
$out = $pasteboard;

header('Content-type: image/png');
imagepng($out);
//then garbage collection

私にこれを与えます:

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

ホレイ!

完璧なアルファpngコンポジット...

今、私はそれを回転させたいので、$ out = $pasteboardの代わりにこれを行います:

imagesavealpha($pasteboard,true);
//rotate it
$out = imagerotate($pasteboard,5,imagecolorexactalpha($pasteboard,255,255,255,50),0);

header('Content-type: image/png');
imagepng($out);

悲しいことにこれを私に与えます:

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

BOOOO!

私は次のように色を設定してみました:

imagerotate($pasteboard,5,0x00000000,0);

また、次のような最後の属性:

imagerotate($pasteboard,5,0x00000000,1);

サンプリングされた新しい空の画像など...

サイコロなし...

誰か助けてもらえますか?

4

3 に答える 3

5

私が質問に答えているのは、ウェブ全体で見た10〜15の提案を試したからです。これらはすべて、「ほぼ」正しい解決策を提供しますが、正確なものは何もありません。また、この質問がいくつかの場所に投稿されているのを見ました。うまくいけば、将来誰かがこのページに到達した場合、直接の答えとして解決策を示すのが最善でしょう。

@cristobalの助けと努力に大いに感謝します。これ以上あなたに投票できれば、私はそうします!

コツは次のようです:

//rotate it
$pasteboard = imagerotate($pasteboard,5,0XFFFFFF00,0); //<-- here must be RRGGBBAA, also last attr set to 0
imagesavealpha($pasteboard, true); // <-- then to save it... dont ask me why..
//send it out
header('Content-type: image/png');
imagepng($pasteboard);

これを生成します(白いページに対しては見えませんが、完全なアルファがあります):

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

私の人生で最も楽しい5時間ではありません...うまくいけば、他の誰かが同じ痛みを経験するのを防ぐでしょう。

于 2012-08-23T02:46:58.687 に答える
2

上記と同じコードを使用し、操作の3番目のパラメーターに青色を使用しますimagerotate。これは、回転後にカバーされていないゾーンを塗りつぶすために使用されます。

imagerotate($pasteboard, 5, 255);

次の画像が表示されます

3番目のパラメータとして青を使用して回転

青い領域はそれが塗りつぶすカバーされていないゾーンであり、黒い色は、回転で使用される補間に沿ってGDがうまく処理できないように見える画像からの境界シャドウであることがわかります。

imagemagickの変換を使用して同じ画像が回転しました。コマンド、つまり$> convert -rotate 5 image.png image_rotated.png下の画像になります

imagemagickを使用して回転

明らかに、GDは回転時にアルファカラーをうまく処理しません。

またはを使用してconvertコマンドを使用するためのアクセス権がある場合は、代わりにそれらの画像操作をimagemagickにパイプする必要があります。GDは、最近あまり更新されていないシンプルな画像ライブラリです。それ以外の場合は、 http: //php.net/manual/en/book.image.php用のpeclプラグインがあるImagemagick、Cairo、またはGmagickを試してください。execprocess

最後の手段として、誰かがあなたが探しているものにGD http://www.exorithm.com/algorithm/view/rotate_image_alphaを使用する関数を作成しましたが、単純な線形補間であるため、結果はきれいではありません。

線形補間

透明度を維持しながらGD画像ライブラリで画像を回転させる方法から取得しましたか?。おそらく、線形補間関数をバイキュービックまたはクワッドに変換すると、見栄えが良くなります。

于 2012-08-23T00:04:59.773 に答える
0

これらの答えは私にはうまくいきませんでしたが、これはうまくいきました。

$destimg = imagecreatefromjpeg("image.png");
$rotatedImage = imagerotate($destimg, 200, 0);
imagesavealpha($rotatedImage, true);
imagepng($rotatedImage,"rotated.png");
于 2016-01-21T09:07:46.763 に答える