【问题标题】:PHP imagecopy of any type to use in imagepng or equivalent在 imagepng 或等效中使用的任何类型的 PHP imagecopy
【发布时间】:2016-04-15 14:14:01
【问题描述】:

我有一个网站,用户可以上传他们选择的图片作为个人资料图片。

此个人资料图片可以上传为 .gif、.png、.jpg 等格式,您知道,标准。

然后我有一个函数应该生成一个“海报”,其中包含所有这些用户个人资料图像。

我的代码如下所示:

for each employee_image:
    $posx = get next x coordinate on poster
    $posy = get next y coordinate on poster
    $employee_image = imagecreatefrompng($image_path);
    $size = getimagesize($employee_image);
    imagecopy($poster_image, $employee_image, $posx, $posy, 0,0, $size[0], $size[1]);

imagepng($im, $poster);

在我将每个$employee_image 复制到我的主要海报图片上后,我完成并上传了图片。

imagepng($im, $poster);

我遇到的问题是,如果我将不同类型的 $employee_images 放入海报中,这将无法正常工作。例如,如果我的员工图像是 jpeg 的,那么 imagecopy 函数无法正确获取图像,它只会导致黑色图像。我相信这是因为生成海报时类型不匹配,因为海报是 png。

有人知道我该如何解决这个问题吗?

我想到的一个解决方案是,我可以只要求我的用户上传一种类型的图像,例如仅 .jpg 或仅 .png。但是,如果有人有一个 .png 并且他们只是将其重命名为 .jpg 或反之亦然,以使其上传怎么办?我的海报不会因为此人的图像不是正确的文件类型而生成黑色图像吗?

我将不胜感激。也许在我imagecopy 之前我可以使用其他功能或某种转换为 png 的功能?

提前致谢。

【问题讨论】:

  • 可以先获取imageType(getimagesize()返回数组的第三个值),然后再做imagecreatefromjpeg,...fromgif,或者frompng

标签: php image image-processing


【解决方案1】:

我写了一个库来做这件事。

见:http://www.geneticcoder.com/EasyImage/

假设您想要一张 3x3 的海报,每张个人资料图片的宽度为 100 像素(假设它们是正方形):

$img1 = EasyImage::Create("/path/to/image1.png")->scale(100);
$img2 = EasyImage::Create("/path/to/image2.png")->scale(100);
$img3 = EasyImage::Create("/path/to/image3.png")->scale(100);
$row1 = $img1->concat($img2, EasyImage::HORIZ)->concat($img3, EasyImage::HORIZ);

$img4 = EasyImage::Create("/path/to/image4.png")->scale(100);
$img5 = EasyImage::Create("/path/to/image5.png")->scale(100);
$img6 = EasyImage::Create("/path/to/image6.png")->scale(100);
$row2 = $img4->concat($img5, EasyImage::HORIZ)->concat($img6, EasyImage::HORIZ);

$img7 = EasyImage::Create("/path/to/image7.png")->scale(100);
$img8 = EasyImage::Create("/path/to/image8.png")->scale(100);
$img9 = EasyImage::Create("/path/to/image9.png")->scale(100);
$row3 = $img7->concat($img8, EasyImage::HORIZ)->concat($img9, EasyImage::HORIZ);

$poster = $row1->concat($row2, EasyImage::BOTTOM)->concat($row3, EasyImage::BOTTOM);

// To send the image to the browser
echo $poster;

// To save to the server
$poster->save("path/to/save/to.png");


这是一个函数
function makePoster($images, $rowWidth=3, $profileWidth=100){
    $rows = array();
    $row = null;
    $i = 0;
    foreach($images as $img){
        $i++;
        if(empty($row)){
            $row = EasyImage::Create($img)->scale($profileWidth);
        }else{
            $row->concat(EasyImage::Create($img)->scale($profileWidth), EasyImage::HORIZ);
        }
        if($i == $rowWidth){
            $rows[] = $row;
            $i = 0;
        }
    }
    $poster = array_shift($rows);
    foreach($rows as $row){
        $poster->concat($row, EasyImage::BOTTOM);
    }
    return $poster;
}

$poster = makePoster($ArrayOfImagePaths);

// To send the image to the browser
echo $poster;

// To save to the server
$poster->save("path/to/save/to.png");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-10
    • 2016-09-12
    • 1970-01-01
    • 2012-02-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-14
    • 1970-01-01
    相关资源
    最近更新 更多