user5263205
user5263205

Reputation:

Crop and resize images in php

I am trying to crop and resize the images. When images moved to the resized_images folder all images are turn to black but images are resized(535 * 313). Here is my code i have tried so far. Can you please suggest me right way to do this.? thank u

<form action="" method="POST" enctype="multipart/form-data">
 <input id="input-6" name="slideshow_images[]" type="file" multiple class="file-loading">
 <input type="submit" name="sub" >
 </form>
<?php 
if(isset($_POST['sub']))
{
$pic =  $_FILES["slideshow_images"]["name"];	 
foreach($pic as $pic_src)
{  	
 
$image = imagecreatefromjpeg($pic_src);
$filename =  'resized_images/'.$pic_src.'cropped_whatever.jpeg';

$thumb_width = 535;

$thumb_height = 313;

$width = imagesx($image);
$height = imagesy($image);
 	
$original_aspect = $width / $height;
$thumb_aspect = $thumb_width / $thumb_height;
 
if ( $original_aspect >= $thumb_aspect )
{
   // If image is wider than thumbnail (in aspect ratio sense)
   $new_height = $thumb_height;
   $new_width = $width / ($height / $thumb_height);
}
else
{
   // If the thumbnail is wider than the image
   $new_width = $thumb_width;
   	
   $new_height = $height / ($width / $thumb_width);

    
   
 }

$thumb = imagecreatetruecolor( $thumb_width, $thumb_height );

// Resize and crop
imagecopyresampled($thumb,
                   $image,
                   0 - ($new_width - $thumb_width) / 2, // Center the image horizontally
                   0 - ($new_height - $thumb_height) / 2, // Center the image vertically
                   0, 0,
                   $new_width, $new_height,
                   $width, $height);
imagejpeg($thumb, $filename, 80);
}

}
  ?>

Upvotes: 1

Views: 3106

Answers (2)

Mark Manning
Mark Manning

Reputation: 1467

I just ran into this problem. What the problem is is the background color is black and totally transparent. What you have to do is just allocate a true color (like white) with alpha and make the alpha totally non-transparent. Then just do a filled rectangle over the new area first and your image should then show up. :-)

The following is directly out of the php documentation about imagecopy:

// create new image with padding
$img = imagecreatetruecolor($right-$left+$padding*2,$bottom-$top+$padding*2);
// Allocate background color
$white = imagecolorallocatealpha( $img, 255, 255, 255, 0 );
// fill the background
imagefill($img, 0, 0, $white);
// or use
imagefilledrectangle( $img, 0,0,$width,$height, $white );
// copy
imagecopy($img, $image, $padding, $padding, $left, $top, $right-$left, $bottom-$top);

Notice that they do an imagefill with the background color before actually copying the new image. It is the same for the imagecopyresample.

Well, unlike before - this time I didn't get a black image. So check what you do against the following: In fact, download the following and run it (along with the test.jpg image). See if it works for you. Please note that this is directly out of the PHP Documentation website for imagecopyresample.

<?php
// The file
$filename = './test.jpg';
$percent = 0.5;

// Content type
header('Content-Type: image/jpeg');

// Get new dimensions
list($width, $height) = getimagesize($filename);
$new_width = $width * $percent;
$new_height = $height * $percent;

// Resample
$image_p = imagecreatetruecolor($new_width, $new_height);
$image = imagecreatefromjpeg($filename);
imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

// Output
imagejpeg($image_p, "new.jpg", 100);
?>

And here is the image:

enter image description here

And here is the output: enter image description here

Upvotes: 0

AlexIL
AlexIL

Reputation: 573

Change your code lines to:

$pic =  $_FILES["slideshow_images"]["tmp_name"];

$image = imagecreatefromstring(file_get_contents(($pic_src)));

Because ["name"] is only 123.jpg, it is not object.

The best way will be that:

<form action="" method="POST" enctype="multipart/form-data">
 <input id="input-6" name="slideshow_images[]" type="file" multiple class="file-loading">
 <input type="submit" name="sub" >
 </form>
<?php 
if(isset($_POST['sub'])){
  if(isset($_FILES['slideshow_images'])){
    foreach ($_FILES["slideshow_images"]["error"] as $key => $error) {
      if ($error == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["slideshow_images"]["tmp_name"][$key];
        $name = $_FILES["slideshow_images"]["name"][$key];
          $image = imagecreatefromstring(file_get_contents(($tmp_name)));
          $filename = 'images/'.$name.'cropped_whatever.jpg';
          $thumb_width = 535;

          $thumb_height = 313;

          $width = imagesx($image);
          $height = imagesy($image);

          $original_aspect = $width / $height;
          $thumb_aspect = $thumb_width / $thumb_height;

          if ( $original_aspect >= $thumb_aspect )
          {
             // If image is wider than thumbnail (in aspect ratio sense)
             $new_height = $thumb_height;
             $new_width = $width / ($height / $thumb_height);
          }
          else
          {
             // If the thumbnail is wider than the image
             $new_width = $thumb_width;

             $new_height = $height / ($width / $thumb_width);



           }

          $thumb = imagecreatetruecolor( $thumb_width, $thumb_height );

          // Resize and crop
          imagecopyresampled($thumb,
                             $image,
                             0 - ($new_width - $thumb_width) / 2, // Center the image horizontally
                             0 - ($new_height - $thumb_height) / 2, // Center the image vertically
                             0, 0,
                             $new_width, $new_height,
                             $width, $height);
          imagejpeg($thumb, $filename, 80);
      }
    }
  }
}
  ?>

Also, If you don't want to add ".jpg" in filename, replace $filename row to this:

$filename = 'images/'.preg_replace('/\.[^.]*$/', '', $name).'cropped_whatever.jpg';

Upvotes: 1

Related Questions