0

我正在通过允许用户上传图像并对其应用样式边框或框架(即云、星星、天空等)来改进我的 Facebook 应用程序之一。用户还可以保存图像,在应用后带有边框。这更好地解释了我需要什么:

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

如果您有任何其他问题或需要更多详细信息,请告诉我。我会编辑这篇文章。

4

2 回答 2

3

使用imagecopy()。该页面上的示例是使用带有 imagecopymerge() 的透明度选项完成的,但我认为您不需要它。

使用 imagecopy() 您将指定用于定位的 X/Y 坐标:

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

where$width$heightwill 是顶部图像的整个宽度和高度。您需要用测量值替换2020测量将在边界周围显示多少边框图像。您可能必须将顶部图像的大小调整为您想要的确切尺寸,否则它可能会与边界重叠一点,距右侧或底部太远。(见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()临时图像资源,否则它们会占用内存。

如果您不想将生成的图像保留在您的服务器上,您可以省略第二个参数,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 回答