首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在imagepng或等效物中使用的任何类型的PHP imagecopy

在imagepng或等效物中使用的任何类型的PHP imagecopy
EN

Stack Overflow用户
提问于 2016-04-15 22:14:01
回答 1查看 82关注 0票数 1

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

这个头像可以上传为.gif,.png,.jpg等,你知道的,标准。

然后我有一个函数,它应该生成一个“海报”,其中包含所有这些用户配置文件的图像。

我的代码看起来像这样:

代码语言:javascript
复制
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,或者反之亦然,以使其上传,该怎么办?我的海报会不会因为不是正确的文件类型而为这个人的图像生成黑色图像?

如果有任何帮助,我将不胜感激。也许有一个替代函数,我可以使用或某种类型的转换到png之前,我imagecopy它?

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2016-04-15 22:34:27

我为这方面的工作写了一个库。

请参阅:http://www.geneticcoder.com/EasyImage/

假设你想要一张3x3的海报,每个头像都有100px宽(假设它们是正方形):

代码语言:javascript
复制
$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");

下面是一个函数

代码语言:javascript
复制
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");
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36649574

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档