0

I am trying to use Imagine to batch make 250x250 thumbnail of more than 90k+ relatively small mobile images. The problem is, when I run a loop,

foreach ($images as $c) {
  $imagine = new Imagine();
  $image = $imagine->open($c);
  $image->resize(new Box(250, 250))->save($outFolder);
}

sometimes, the image is corrupted and the open() method fails, throwing exception:

Unable to open image vendor/imagine/imagine/lib/Imagine/Gd/Imagine.php Line: 96

and completely breaks the loop. Is there a way, to check if open failed? something like:

foreach ($images as $c) {
  $imagine = new Imagine();
  $image = $imagine->open($c);
  if ($image) {
     $image->resize(new Box(250, 250))->save($outFolder);
  } else {
     echo 'corrupted: <br />';
  }
}

Hope somebody can help. or if its not possible, can you suggest a PHP image library that I can pragmatically resize by batch?

Thank you

arvil
  • 840
  • 11
  • 27

1 Answers1

1

For handling the exception just use try-catch.

From the library documentation

The ImagineInterface::open() method may throw one of the following exceptions:

Imagine\Exception\InvalidArgumentException

Imagine\Exception\RuntimeException

Try it like this:

$imagine = new Imagine(); // Probably no need to instantiate it in every loop
foreach ($images as $c) {
    try {
        $image = $imagine->open($c);
    } catch (\Exception $e) {
        echo 'corrupted: <br />';
        continue;
    }
    $image->resize(new Box(250, 250))->save($outFolder);
}
BVengerov
  • 2,947
  • 1
  • 18
  • 32