我有一个网站,在那里用户可以上传他们选择的照片作为他们的个人资料图片。
这个头像可以上传为.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,或者反之亦然,以使其上传,该怎么办?我的海报会不会因为不是正确的文件类型而为这个人的图像生成黑色图像?
如果有任何帮助,我将不胜感激。也许有一个替代函数,我可以使用或某种类型的转换到png之前,我imagecopy它?
提前谢谢。
发布于 2016-04-15 22:34:27
我为这方面的工作写了一个库。
请参阅:http://www.geneticcoder.com/EasyImage/
假设你想要一张3x3的海报,每个头像都有100px宽(假设它们是正方形):
$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");https://stackoverflow.com/questions/36649574
复制相似问题