0

ユーザーが画像をアップロードし、スタイル付きの境界線またはフレーム (雲、星、空など) を適用できるようにすることで、Facebook アプリの 1 つを改善しようとしています。ユーザーは、適用後に境界線を付けて画像を保存することもできます。これは、私が必要とするものをもう少しよく説明しています:

http://zbrowntechnology.info/ImgDisp/imgdisp.php

他に質問がある場合、または詳細が必要な場合は、お知らせください。この投稿を編集します。

4

2 に答える 2

3

imagecopy()を使用します。そのページの例は、imagecopymerge() で透明度オプションを使用して行われていますが、それは必要ないと思います。

imagecopy() を使用して、配置に使用する X/Y 座標を指定します。

imagecopy( $borderimage, $topimage, 20, 20, 0, 0, $width, $height);

$widthとはトップ画像全体の幅$heightと高さになります。20および20を、境界線の周りに表示される境界線の画像の量の測定値に置き換えます。上部の画像を希望する正確な寸法にサイズ変更する必要があるでしょう。そうしないと、境界線と少し右または下にオーバーラップする可能性があります。( imagecopyresampled()を参照)

編集:

プロセス全体を行う大まかな方法​​を次に示します (chosenborder.pngが選択された境界線であり、uploadedimage.pngがアップロードされた画像であると仮定します。別の画像タイプの場合は、対応する関数を使用します)。

$borderx = 20; // The width of our border
$border = imagecreatefrompng("chosenborder.png");
$topimage = imagecreatefrompng("uploadedimage.png");
$bordersize = getimagesize($border);
$topimagesize = getimagesize($topimage);

/* The new dimensions of topimage. $borderx*2 means we account for
   the border on both left and right, top and bottom. */
$newx = $bordersize[0] - ($borderx*2);
$newy = $bordersize[1] - ($borderx*2);
imagecopyresampled( $topimage_scaled, $topimage, 0, 0, 0, 0,
              $newx, $newy, $topimagesize[0], $topimagesize[1]);

/* Merge the images */
imagecopy( $border, $topimage_scaled, $borderx, $borderx,
              0, 0, $width, $height);
/* Output the image */
imagepng($border, "newimage.png");
/* Free up the memory occupied by the image resources */
imagedestroy($border);
imagedestroy($topimage);

ユーザーが画像をアップロードしたら、検索chosenborder.pnguploadedimage.pngて上記のスクリプトを実行newimage.pngし、ユーザーに表示すれば準備完了です。imagedestroy()一時的な画像リソースを呼び出すようにしてください。そうしないと、メモリが消費されます。

生成された画像をサーバーに保持したくない場合は、2 番目の引数を省略してimagepng()、画像情報を画像としてブラウザーに直接送信することができます。その場合、正しい画像を書き込む必要があります。 HTTP ヘッダー

于 2010-10-16T02:19:51.577 に答える
0

css3を使用したクライアント側のソリューション:

css3プロパティborder-imageをチェックアウトします (境界線付きのimgを保存する要件を満たしていません)

2つの異なるイメージをマージすることによるサーバー側のソリューション:

<?php


$imgFile = 'img.jpg';
$brdFile = 'brd.jpg';
$img = addBorder($imgFile,$brdFile);
outputImage($img);

function addBorder($imgFile,$brdFile)
{
    $img=imagecreatefromjpeg($imgFile);
    $brd=imagecreatefromjpeg($brdFile);

    $imgSize = getimagesize($imgFile);
    $brdSize = getimagesize($brdFile);


    //NOTE: the border img MUST be bigger then the src img
    $dst_x = ceil(($brdSize[0] - $imgSize[0])/2);
    $dst_y = ceil(($brdSize[1] - $imgSize[1])/2);


    imagecopymerge  ( $brd, $img, $dst_x,  $dst_y,  0, 0, $imgSize[0], $imgSize[1] ,100  );

    return $brd;
}   

function outputImage($img)
{
    header('Content-type: image/png');  
    imagepng($img);
}

?>
于 2010-10-16T01:47:35.237 に答える