Unable to create thumb, image is black

前端 未结 4 1623
花落未央
花落未央 2021-01-26 03:27

Am uploading Multiple image from single input and create thumb form all uploaded image on fly But when i run code i get only black image but orginal image is same as upl

4条回答
  •  醉酒成梦
    2021-01-26 04:04

    Problem

    The problem is located in the following line:

    imagecopyresampled($dimg, $simg, -$int_width, 0, 0, 0, $adjusted_width, $nh, $w, $h);
    

    Why are you using a negative value as destination's x? Your source image is actually put at the left of your target image, so your target image appears empty.

    Solution

    I invite you to use the following function to resize your image:

    function resizePreservingAspectRatio($img, $targetWidth, $targetHeight)
    {
       $srcWidth = imagesx($img);
       $srcHeight = imagesy($img);
    
       // Determine new width / height preserving aspect ratio
       $srcRatio = $srcWidth / $srcHeight;
       $targetRatio = $targetWidth / $targetHeight;
       if (($srcWidth <= $targetWidth) && ($srcHeight <= $targetHeight))
       {
          $imgTargetWidth = $srcWidth;
          $imgTargetHeight = $srcHeight;
       }
       else if ($targetRatio > $srcRatio)
       {
          $imgTargetWidth = (int) ($targetHeight * $srcRatio);
          $imgTargetHeight = $targetHeight;
       }
       else
       {
          $imgTargetWidth = $targetWidth;
          $imgTargetHeight = (int) ($targetWidth / $srcRatio);
       }
    
       // Creating new image with desired size
       $targetImg = imagecreatetruecolor($targetWidth, $targetHeight);
    
       // Add transparency if your reduced image does not fit with the new size
       $targetTransparent = imagecolorallocate($targetImg, 255, 0, 255);
       imagefill($targetImg, 0, 0, $targetTransparent);
       imagecolortransparent($targetImg, $targetTransparent);
    
       // Copies image, centered to the new one (if it does not fit to it)
       imagecopyresampled(
          $targetImg, $img, ($targetWidth - $imgTargetWidth) / 2, // centered
          ($targetHeight - $imgTargetHeight) / 2, // centered
          0, 0, $imgTargetWidth, $imgTargetHeight, $srcWidth, $srcHeight
       );
    
       return $targetImg;
    }
    

    Implementation

     $tmp_name)
       {
          $file_name = $key . $_FILES['files']['name'][$key];
          $file_size = $_FILES['files']['size'][$key];
          $file_tmp = $_FILES['files']['tmp_name'][$key];
          $file_type = $_FILES['files']['type'][$key];
          if ($file_size > 2097152000)
          {
             $errors[] = 'File size must be less than 2 MB';
          }
          $desired_dir = "user_data/";
          if (empty($errors) == true)
          {
             if (is_dir($desired_dir) == false)
             {
                mkdir("$desired_dir", 0700);        // Create directory if it does not exist
             }
             if (is_dir("$desired_dir/" . $file_name) == false)
             {
                move_uploaded_file($file_tmp, "$desired_dir/" . $newname . $file_name);
             }
             else
             {                                  // rename the file if another one exist
                $new_dir = "$desired_dir/" . $newname . $file_name;
                rename($file_tmp, $new_dir);
             }
          }
          else
          {
             print_r($errors);
          }
       }
       if (empty($error))
       {
          echo "FILE : $file1
    "; echo "FILE : $file2
    "; echo "FILE : $file3
    "; echo "FILE : $file4
    "; echo "FILE : $file5
    "; } $orig_directory = "$desired_dir"; //Full image folder $thumb_directory = "thumb/"; //Thumbnail folder /* Opening the thumbnail directory and looping through all the thumbs: */ $dir_handle = @opendir($orig_directory); //Open Full image dirrectory if ($dir_handle > 1) { //Check to make sure the folder opened $allowed_types = array ('jpg', 'jpeg', 'gif', 'png'); $file_type = array (); $ext = ''; $title = ''; $i = 0; while ($file_name = @readdir($dir_handle)) { /* Skipping the system files: */ if ($file_name == '.' || $file_name == '..') continue; $file_type = explode('.', $file_name); //This gets the file name of the images $ext = strtolower(array_pop($file_type)); /* Using the file name (withouth the extension) as a image title: */ $title = implode('.', $file_type); $title = htmlspecialchars($title); /* If the file extension is allowed: */ if (in_array($ext, $allowed_types)) { /* If you would like to inpute images into a database, do your mysql query here */ /* The code past here is the code at the start of the tutorial */ /* Outputting each image: */ $nw = 100; $nh = 100; $source = "$desired_dir{$file_name}"; $stype = explode(".", $source); $stype = $stype[count($stype) - 1]; $dest = "thumb/{$file_name}"; $size = getimagesize($source); $w = $size[0]; $h = $size[1]; switch ($stype) { case 'gif': $simg = imagecreatefromgif($source); break; case 'jpg': $simg = imagecreatefromjpeg($source); break; case 'png': $simg = imagecreatefrompng($source); break; } $dimg = resizePreservingAspectRatio($simg, $nw, $nh); imagepng($dimg, $dest); } } /* Closing the directory */ @closedir($dir_handle); } } function resizePreservingAspectRatio($img, $targetWidth, $targetHeight) { $srcWidth = imagesx($img); $srcHeight = imagesy($img); // Determine new width / height preserving aspect ratio $srcRatio = $srcWidth / $srcHeight; $targetRatio = $targetWidth / $targetHeight; if (($srcWidth <= $targetWidth) && ($srcHeight <= $targetHeight)) { $imgTargetWidth = $srcWidth; $imgTargetHeight = $srcHeight; } else if ($targetRatio > $srcRatio) { $imgTargetWidth = (int) ($targetHeight * $srcRatio); $imgTargetHeight = $targetHeight; } else { $imgTargetWidth = $targetWidth; $imgTargetHeight = (int) ($targetWidth / $srcRatio); } // Creating new image with desired size $targetImg = imagecreatetruecolor($targetWidth, $targetHeight); // Add transparency if your reduced image does not fit with the new size $targetTransparent = imagecolorallocate($targetImg, 255, 0, 255); imagefill($targetImg, 0, 0, $targetTransparent); imagecolortransparent($targetImg, $targetTransparent); // Copies image, centered to the new one (if it does not fit to it) imagecopyresampled( $targetImg, $img, ($targetWidth - $imgTargetWidth) / 2, // centered ($targetHeight - $imgTargetHeight) / 2, // centered 0, 0, $imgTargetWidth, $imgTargetHeight, $srcWidth, $srcHeight ); return $targetImg; } ?>





    Note: I am saving as PNG, as if you want a 100x100 image using a non-square image (such as 800x600), and without breaking its aspect ratio, we should put transparency behind the unused space and JPEG do not support it.

提交回复
热议问题