Imagick::readImage

(PECL imagick 2, PECL imagick 3)

Imagick::readImageReads image from filename

Description

public Imagick::readImage(string $filename): bool

Reads image from filename

Parameters

filename

Return Values

Returns true on success.

add a note add a note

User Contributed Notes 3 notes

up
21
markus dot s dot schmitz at gmail dot com
11 years ago
Use this to convert all pages of a PDF to JPG:

<?php
$imagick
= new Imagick();
$imagick->readImage('myfile.pdf');
$imagick->writeImages('converted.jpg', false);
?>

If you need better quality, try adding $imagick->setResolution(150, 150); before reading the file!

If you experience transparency problems when converting PDF to JPEG (black background), try flattening your file:

<?php
$imagick
= new Imagick();
$imagick->readImage('myfile.pdf[0]');
$imagick = $imagick->flattenImages();
$imagick->writeFile('pageone.jpg');
?>

In order to read pages from a PDF-file use [PAGENUMBER] after the filename (pages start from zero!).

Example: Read page #1 from test.pdf

<?php
$imagick
= new Imagick();
$imagick->readImage('test.pdf[0]');
$imagick->writeImage('page_one.jpg');
?>
up
6
holdoffhunger at gmail dot com
11 years ago
What is the difference between ReadImage and ReadImageFile?  Based by looking at the pages, you would think that they behave the exact same, except in their arguments: ReadImage takes a string containing the folder location of the file, and ReadImageFile takes a handle pointing to the file location.  Initially, the first looks far more tempting, since you don't have to worry about fopen and fclose commands.

But, there is a problem with the ReadImage function!  With an imagemagick object whose data was created from this function, I could scale, change the colors, and perform artistic effects upon the object, without any problems at all, but then there was a problem with saving: it seemed to be keep me stuck to the image format of the original image (in this case, a ".jpg", but it may be different elsewhere).  The functions setImageFormat and setFormat, programmed line after line, provided no effect to changing the format to png, bmp, or gif.  When the only line of code I changed was ReadImage to ReadImageFile, the problem disappears entirely.

Some sample code to demonstrate (using PHP Version 5.2.17).  Input Filename: test.jpg.  Output Filenames: test_result_bad.bmp, test_result_bad.png, test_result_good.bmp, test_result_good.png.  The resultant filesizes should be enough to convince you that all bad files are merely duplicate jpgs...

<?php

           
// Author: holdoffhunger@gmail.com

        // Preset Image Location
        // ------------------------------

   
$image_file_location = "test.jpg";

       
// Create Objects
        // ------------------------------

   
$imagick_type_bad = new Imagick();
   
$imagick_type_good = new Imagick();

       
// Grab Data - BAD METHOD
        // ------------------------------

   
$imagick_type_bad->readImage($image_file_location);

       
// Grab Data - GOOD METHOD
        // ------------------------------
   
   
$file_handle_for_viewing_image = fopen($image_file_location, 'a+');
   
   
$imagick_type_good->readImageFile($file_handle_for_viewing_image);
   
   
fclose($file_handle_for_viewing_image);

       
// Save File - BAD DATA
        // ------------------------------

   
$file_handle_for_saving_bad_bmp = fopen("test_result_bad.bmp", 'a+');

   
$imagick_type_bad_bmp = clone $imagick_type_bad;
   
$imagick_type_bad_bmp->setImageFormat("bmp");
   
$imagick_type_bad_bmp->setFormat("bmp");
   
$imagick_type_bad_bmp->writeImageFile($file_handle_for_saving_bad_bmp);

   
fclose($file_handle_for_saving_bad_bmp);

   
$file_handle_for_saving_bad_png = fopen("test_result_bad.png", 'a+');

   
$imagick_type_bad_png = clone $imagick_type_bad;
   
$imagick_type_bad_png->setImageFormat("png");
   
$imagick_type_bad_png->setFormat("png");
   
$imagick_type_bad_png->writeImageFile($file_handle_for_saving_bad_png);

   
fclose($file_handle_for_saving_bad_png);

       
// Save File - Good DATA
        // ------------------------------

   
$file_handle_for_saving_good_bmp = fopen("test_result_good.bmp", 'a+');

   
$imagick_type_good_bmp = clone $imagick_type_good;
   
$imagick_type_good_bmp->setImageFormat("bmp");
   
$imagick_type_good_bmp->setFormat("bmp");
   
$imagick_type_good_bmp->writeImageFile($file_handle_for_saving_good_bmp);

   
fclose($file_handle_for_saving_good_bmp);

   
$file_handle_for_saving_good_png = fopen("test_result_good.png", 'a+');

   
$imagick_type_good_png = clone $imagick_type_good;
   
$imagick_type_good_png->setImageFormat("png");
   
$imagick_type_good_png->setFormat("png");
   
$imagick_type_good_png->writeImageFile($file_handle_for_saving_good_png);

   
fclose($file_handle_for_saving_good_png);

?>
up
-3
lindsay at axys dot co dot nz
9 years ago
If you have just uploaded the PDF and want to generate an image from the first page, the [0] needs to be added to the image name as a text string.

        $filename = getSafeFileName($uploaddir,basename($_FILES['brochure_pdf']['name'], $overwrite));
        $uploadfile = $uploaddir . $filename;
        if (move_uploaded_file($_FILES['brochure_pdf']['tmp_name'], $uploadfile)) {
              $brochure_pdf = $filename;
            $im = new Imagick();
            $im->setResolution(80,80);
            $im->readimage($uploadfile."[0]");
            $im->setImageFormat('jpeg');
            $image_name = "save_as_name.jpg";
            $imageprops = $im->getImageGeometry();
            if ($imageprops['width'] <= 175 && $imageprops['height'] <= 300) {
                // don't upscale
             } else {
                 $im->resizeImage(175,300, imagick::FILTER_LANCZOS, 0.9, true);
             }

            $im->writeImage($uploaddir .$image_name);
            $im->clear();
            $im->destroy();
To Top