Imagick::readImage

(PECL imagick 0.9.0-0.9.9)

Imagick::readImageReads image from filename

说明

bool Imagick::readImage ( string $filename )

Reads image from filename

参数

filename

返回值

成功时返回 TRUE

User Contributed Notes

lindsay at axys dot co dot nz 04-Mar-2015 08:53
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();
holdoffhunger at gmail dot com 11-Jan-2013 12:50
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);

?>
markus dot s dot schmitz at gmail dot com 11-Dec-2012 07:43
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');
?>