PHP - 上传PNG图像透明
问题描述:
I would like to upload png images transparent, I tried many things via google but still didnt work, still background is black. Here is my code, it is written in symfony 2.7. It is uploading and creating two images, one is small, the second is big.
So here you can see difference between images before upload and after upload.
if ($upload_type == 'image/png' || $upload_type == 'image/jpg' || $upload_type == 'image/jpeg' || $upload_type == 'image/gif') {
$filename = stripslashes($upload_name);
$extension = $this->getExtension($filename);
$extension = strtolower($extension);
if ($extension == "jpg" || $extension == "jpeg") {
$upload_temp = $_FILES['form-chat-send-image']['tmp_name'];
$src = imagecreatefromjpeg($upload_temp);
} else if ($extension == "png") {
$upload_temp = $_FILES['form-chat-send-image']['tmp_name'];
$src = imagecreatefrompng($upload_temp);
} else {
$src = imagecreatefromgif($upload_temp);
}
list($width, $height) = getimagesize($upload_temp);
$newWidth1 = $width;
$newHeight1 = $height;
if($width>1200 || $height>1200) {
if ($height < $width) {
$newWidth1 = 1200;
$newHeight1 = ($height / $width) * $newWidth1;
} else {
$newHeight1 = 1200;
$newWidth1 = ($width / $height) * $newHeight1;
}
}
$tmp1 = imagecreatetruecolor($newWidth1, $newHeight1);
$newWidth2 = $width;
$newHeight2 = $height;
if($width>220 || $height>220) {
if ($height < $width) {
$newWidth2 = 220;
$newHeight2 = ($height / $width) * $newWidth2;
} else {
$newHeight2 = 220;
$newWidth2 = ($width / $height) * $newHeight2;
}
}
$tmp2 = imagecreatetruecolor($newWidth2, $newHeight2);
imagecolortransparent($tmp2, imagecolorallocate($tmp2, 0, 0, 0));
imagealphablending( $tmp2, false );
imagesavealpha( $tmp2, true );
imagecopyresampled($tmp1, $src, 0, 0, 0, 0, $newWidth1, $newHeight1,
$width, $height);
imagecopyresampled($tmp2, $src, 0, 0, 0, 0, $newWidth2, $newHeight2,
$width, $height);
$dateName = new \DateTime();
$newName = $conversation->getId().'-'.$dateName->format('m_d_Y_H_i_s');
$filename1 = $uploadTo . $newName . "." . $extension;
$filename2 = $uploadTo . "small/" . $newName . "." . $extension;
imagejpeg($tmp1, $filename1, 100);
imagejpeg($tmp2, $filename2, 100);
imagedestroy($src);
imagedestroy($tmp1);
imagedestroy($tmp2);
$uploadDB = $newName . "." . $extension;
$msgImg = new Message();
$msgImg->setText($uploadDB);
$msgImg->setConversation($conversation);
$msgImg->setForm('img');
if($type==2){
$msgImg->setType(0);
}
else if($type==1){
$msgImg->setType(1);
}
$em->persist($msgImg);
$em->flush();
$_FILES = array();
return $this->redirect($this->generateUrl('conversation',array('id'=>$conversation->getId())));
}
答
imagejpeg($tmp1, $filename1, 100);
imagejpeg($tmp2, $filename2, 100);
JPEG does not support transparency. You need imagepng
and use PNG format instead.
That being said, you seem to have code that loads in the image (using imagecreatefrom*
as appropriate), why not do the same for saving (image*
)?