使用php上传具有透明背景的png图像,并保持背景透明


uploading png images with transparent background using php and keeping the background transparent

我有一个php页面,它获取用户图像并将其上传到我的Web服务器。

我刚刚注意到,如果我有一个透明背景的png,并上传它,背景会变为白色。

例如,我在photoshop中创建了一个透明背景的新图像,然后在页面上添加一个彩色圆圈。我将图像保存为png,并通过ftp上传到服务器,然后图像在网页上显示为圆形,因为背景是透明的。

如果我使用带有文件输入框的php上传图像,则图像将变为白色。

我尝试过使用imagealphablending、imagecolorallocatelpha、imagefill和imagesavealpha来保留透明背景,但它只是将bg更改为黑色。

有线索吗?

这是我的php代码

        <?php
    $path = "../userfiles/orig/";
    $userpath="../".$_REQUEST['userpath']."/";
    function getExtension($str) {
        $i = strrpos($str,".");
        if (!$i) { return ""; } 
        $l = strlen($str) - $i;
        $ext = substr($str,$i+1,$l);
        return $ext;
    }
    $valid_formats = array("jpg", "png", "gif", "bmp","jpeg","PNG","JPG","JPEG","GIF","BMP");
    if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
        $name = $_FILES['photoimg']['name'];
        $size = $_FILES['photoimg']['size'];
        if(strlen($name)){
                 $ext = getExtension($name);
                if(in_array($ext,$valid_formats)){
                    if($size<(2048*2048)){
                        $time1=time();
                        $actual_image_name =$time1."_".str_replace(" ", "_", $name);
                        $tmp = $_FILES['photoimg']['tmp_name'];
                        if(move_uploaded_file($tmp, $path.$actual_image_name)){                                     
                                     $image=$actual_image_name;                     
                                     /*--------resize image-----------*/
                                     $size = 320; // the imageheight
                                     $filedir = '../userfiles/orig/'; // the directory for the original image
                                     $thumbdir = $userpath; // the directory for the resized image
                                     $prefix = $time1.'_'; // the prefix to be added to the original name
                                     $maxfile = '20000000'; 
                                     $mode = '0666';
                                     $userfile_name =str_replace(" ", "", $_FILES['photoimg']['name']);
                                     $userfile_tmp = str_replace(" ", "", $_FILES['photoimg']['tmp_name']);
                                     $userfile_size =$_FILES['photoimg']['size'];
                                     $userfile_type = $_FILES['photoimg']['type'];
                                     if (isset($_FILES['photoimg']['name'])){
                                         $prod_img = $filedir.$actual_image_name;
                                         $prod_img_thumb = $thumbdir.$prefix.$userfile_name;
                                         move_uploaded_file($userfile_tmp, $prod_img);
                                         chmod ($prod_img, octdec($mode));
                                         $sizes = getimagesize($prod_img);
                                         $aspect_ratio = $sizes[1]/$sizes[0]; 
                                         if ($sizes[1] <= $size){
                                             $new_width = $sizes[0];
                                             $new_height = $sizes[1];
                                         }else{
                                             $new_height = $size;
                                             $new_width = abs($new_height/$aspect_ratio);
                                         }
                                         $destimg=ImageCreateTrueColor($new_width,$new_height)
                                             or die('Problem In Creating image');
                                        switch($ext){
                                            case "jpg":
                                            case "jpeg":
                                            case "JPG":
                                            case "JPEG":
                                                $srcimg=ImageCreateFromJPEG($prod_img)or die('Problem In opening Source Image');
                                            break;
                                            case "PNG":
                                            case "png":
                                                $srcimg = imageCreateFromPng($prod_img)or die('Problem In opening Source Image');
                                                imagealphablending($destimg, false);
                                                $colorTransparent = imagecolorallocatealpha($destimg, 0, 0, 0x7fff0000);
                                                imagefill($destimg, 0, 0, $colorTransparent);                                                   
                                                imagesavealpha($destimg, true);
                                            break;
                                            case "BMP":
                                            case "bmp":
                                                $srcimg = imageCreateFromBmp($prod_img)or die('Problem In opening Source Image');
                                            break;
                                            case "GIF":
                                            case "gif":
                                                $srcimg = imageCreateFromGif($prod_img)or die('Problem In opening Source Image');
                                            break;
                                            default:
                                                $srcimg=ImageCreateFromJPEG($prod_img)or die('Problem In opening Source Image');
                                        }
                                        if(function_exists('imagecopyresampled')){
                                             imagecopyresampled($destimg,$srcimg,0,0,0,0,$new_width,$new_height,imagesX($srcimg),imagesY($srcimg))
                                             or die('Problem In resizing');
                                         }else{
                                             Imagecopyresized($destimg,$srcimg,0,0,0,0,$new_width,$new_height,imagesX($srcimg),imagesY($srcimg))
                                             or die('Problem In resizing');
                                         }
                                         ImageJPEG($destimg,$prod_img_thumb,90)
                                             or die('Problem In saving');
                                     }
                                unlink($prod_img);
                                echo "<img src='".$prod_img_thumb."'>";
                            }else{
                            echo "Fail upload folder with read access.";
                            }
                    }else{
                    echo "Image file size max 3 MB";
                    }
                }else{
                    echo "Invalid file format..";
                }
            }else{
            echo "Please select image..!";
            }
        exit;
    }
    ?>
<?php
$path = "../userfiles/orig/";
$userpath="../".$_REQUEST['userpath']."/";
function getExtension($str) {
  $i = strrpos($str,".");
  if (!$i) { return ""; }
  $l = strlen($str) - $i;
  $ext = substr($str,$i+1,$l);
  return $ext;
}
$valid_formats = array("jpg", "png", "gif", "bmp","jpeg","PNG","JPG","JPEG","GIF","BMP");
if(isset($_POST) and $_SERVER['REQUEST_METHOD'] == "POST"){
  $name = $_FILES['photoimg']['name'];
  $size = $_FILES['photoimg']['size'];
  if(strlen($name)){
    $ext = getExtension($name);
    if(in_array($ext,$valid_formats)){
      if($size<(2048*2048)){
        $time1=time();
        $actual_image_name =$time1."_".str_replace(" ", "_", $name);
        $tmp = $_FILES['photoimg']['tmp_name'];
        if(move_uploaded_file($tmp, $path.$actual_image_name)){
          $image=$actual_image_name;
          /*--------resize image-----------*/
          $size = 320; // the imageheight
          $filedir = '../userfiles/orig/'; // the directory for the original image
          $thumbdir = $userpath; // the directory for the resized image
          $prefix = $time1.'_'; // the prefix to be added to the original name
          $maxfile = '20000000';
          $mode = '0666';
          $userfile_name =str_replace(" ", "", $_FILES['photoimg']['name']);
          $userfile_tmp = str_replace(" ", "", $_FILES['photoimg']['tmp_name']);
          $userfile_size =$_FILES['photoimg']['size'];
          $userfile_type = $_FILES['photoimg']['type'];
          if (isset($_FILES['photoimg']['name'])){
            $prod_img = $filedir.$actual_image_name;
            $prod_img_thumb = $thumbdir.$prefix.$userfile_name;
            move_uploaded_file($userfile_tmp, $prod_img);
            chmod ($prod_img, octdec($mode));
            $sizes = getimagesize($prod_img);
            $aspect_ratio = $sizes[1]/$sizes[0];
            if ($sizes[1] <= $size){
              $new_width = $sizes[0];
              $new_height = $sizes[1];
            }else{
              $new_height = $size;
              $new_width = abs($new_height/$aspect_ratio);
            }
            $destimg=ImageCreateTrueColor($new_width,$new_height)
            or die('Problem In Creating image');
            switch($ext){
              case "jpg":
              case "jpeg":
              case "JPG":
              case "JPEG":
                $srcimg=ImageCreateFromJPEG($prod_img)or die('Problem In opening Source Image');
                break;
              case "PNG":
              case "png":
                $srcimg = imageCreateFromPng($prod_img)or die('Problem In opening Source Image');
                imagealphablending($destimg, false);
                $colorTransparent = imagecolorallocatealpha($destimg, 0, 0, 0, 0x7fff0000);
                imagefill($destimg, 0, 0, $colorTransparent);
                imagesavealpha($destimg, true);
                break;
              case "BMP":
              case "bmp":
                $srcimg = imageCreateFromBmp($prod_img)or die('Problem In opening Source Image');
                break;
              case "GIF":
              case "gif":
                $srcimg = imageCreateFromGif($prod_img)or die('Problem In opening Source Image');
                break;
              default:
                $srcimg=ImageCreateFromJPEG($prod_img)or die('Problem In opening Source Image');
            }
            if(function_exists('imagecopyresampled')){
              imagecopyresampled($destimg,$srcimg,0,0,0,0,$new_width,$new_height,imagesX($srcimg),imagesY($srcimg))
              or die('Problem In resizing');
            }else{
              Imagecopyresized($destimg,$srcimg,0,0,0,0,$new_width,$new_height,imagesX($srcimg),imagesY($srcimg))
              or die('Problem In resizing');
            }

            // Saving an image
            switch(strtolower($ext)){
              case "jpg":
              case "jpeg":
                ImageJPEG($destimg,$prod_img_thumb,90) or die('Problem In saving');
                break;
              case "png":
                imagepng($destimg,$prod_img_thumb) or die('Problem In saving');
                break;
              case "bmp":
                imagewbmp($destimg, $prod_img_thumb)or die('Problem In saving');
                break;
              case "gif":
                imagegif($destimg,$prod_img_thumb) or die('Problem In saving');
                break;
              default:
                // if image format is unknown, and you whant save it as jpeg, maybe you should change file extension
                imagejpeg($destimg,$prod_img_thumb,90) or die('Problem In saving');
            }

          }
          unlink($prod_img);
          echo "<img src='".$prod_img_thumb."'>";
        }else{
          echo "Fail upload folder with read access.";
        }
      }else{
        echo "Image file size max 3 MB";
      }
    }else{
      echo "Invalid file format..";
    }
  }else{
    echo "Please select image..!";
  }
  exit;
}
?>

对不起我的英语。问题是您试图使用imagejpeg保存图像,这意味着新图像不能再使用透明颜色。如果源图像是PNG,您应该使用imagepng保存它。