【发布时间】:2012-01-22 21:58:04
【问题描述】:
我有一个 PHP 表单,允许上传图片并检查 exif_imagetype(); 以确保图片有效。
但是,我希望所有格式(PNG、JPG、JPEG 和 GIF)在提交后最终都是 PNG。
我该怎么做?
【问题讨论】:
我有一个 PHP 表单,允许上传图片并检查 exif_imagetype(); 以确保图片有效。
但是,我希望所有格式(PNG、JPG、JPEG 和 GIF)在提交后最终都是 PNG。
我该怎么做?
【问题讨论】:
使用gd functions 非常简单:
switch (exif_imagetype($image)) {
case IMAGETYPE_GIF :
$img = imagecreatefromgif($image);
break;
case IMAGETYPE_JPEG :
$img = imagecreatefromjpeg($image);
break;
default :
throw new InvalidArgumentException('Invalid image type');
}
imagepng($img, $filename);
为了简洁起见,如果图像已经是 PNG,这显然不能处理这种情况。
【讨论】:
那么你只需要imagepng()。事实上,它几乎变成了一条线:
imagepng(imagecreatefromstring(file_get_contents($filename)), "output.png");
您将使用$_FILES["id"]["tmp_name"] 作为文件名,并且显然使用不同的输出文件名。但是图像格式探测本身就会变得多余。
【讨论】:
imagedestroy() 来删除临时文件?
imagedestroy,因为它需要一个句柄(如果你使用两行代码就可以得到)。脚本结束时,上传的临时文件将自动删除。
你可以根据图片的类型选择正确的函数来打开文件:
$extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION));
switch ($extension) {
case 'jpg':
case 'jpeg':
$image = imagecreatefromjpeg($filename);
break;
case 'gif':
$image = imagecreatefromgif($filename);
break;
case 'png':
$image = imagecreatefrompng($filename);
break;
}
然后您只需使用以下命令保存文件:
imagepng($image, $new_filename, $quality);
可能值得注意的是,这只会解析实际的扩展名而不会真正验证,因此文件是特定格式的。例如,您可以拍摄 jpg 图像并将扩展名更改为 png。
所以更好的方法是使用exif_imagetype(),它将返回图像的类型,而不取决于实际的扩展名。
【讨论】:
<form method="post" enctype="multipart/form-data">
<input type="file" name="image" />
<input type="submit" name="submit" value="Submit" />
</form>
<?php
if(isset($_POST['submit']))
{
if(exif_imagetype($_FILES['image']['tmp_name']) == IMAGETYPE_GIF)
{
$newpng = 'image.png';
$png = imagepng(imagecreatefromgif($_FILES['image']['tmp_name']), $newpng);
}
elseif(exif_imagetype($_FILES['image']['tmp_name']) == IMAGETYPE_JPEG)
{
$newpng = 'image.png';
$png = imagepng(imagecreatefromjpeg($_FILES['image']['tmp_name']), $newpng);
}
else //already png
{
$newpng = 'image.png';
}
}
?>
【讨论】: