php Imagemagick jpg black background

11,095

Solution 1

I solved it by;

$im = new imagick(realpath($file).'[0]');
$im->setCompression(Imagick::COMPRESSION_JPEG);
$im->setCompressionQuality(100);
$im->setImageFormat("jpeg");
$im->writeImage("imagename.jpg");

Solution 2

None of the previously posted answers worked for me however the below did:

$image = new Imagick;

$image->setResolution(300, 300);

$image->readImage("{$originalPath}[0]");

$image->setImageFormat('jpg');

$image->scaleImage(500, 500, true);

$image->setImageAlphaChannel(Imagick::VIRTUALPIXELMETHOD_WHITE);

As I'm using the Laravel framework I then take the converted image and store it using Laravels filesystem.

Storage::put($storePath, $image->getImageBlob());

Update: So I recently changed OS and whereas this previously worked on my Ubuntu machine on my Mac certain images were still coming out black.

I had to change the script to the below:

$image = new Imagick;

$image->setResolution(300, 300);

$image->setBackgroundColor('white');

$image->readImage("{$originalPath}[0]");

$image->setImageFormat('jpg');

$image->scaleImage(500, 500, true);

$image->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);

$image->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);

Seems important to set the background colour before reading in the image. I also flatten any possible layers and remove the alpha channel. I feel like I tried ALPHACHANNEL_REMOVE on my Ubuntu machine and it didn't work so hopefully between these answers readers can find something that works for them.

Solution 3

If your version of Imagick is not up to date, the setImageBackgroundColor may be wrong.

Swap the following line

$im->setImageBackgroundColor("red");

to this (Imagick version >= 2.1.0)

$im->setBackgroundColor(new ImagickPixel("red"));

or (Imagick version < 2.1.0)

$im->setBackgroundColor("red");

Solution 4

change this code $im->setimageformat("jpg"); to this code $im->setimageformat("png"); if you face a background colour issue.

Solution 5

Just use flattenImages() right after creating a new imagick():

$im = new Imagick('file.pdf[0]');
$im = $im->flattenImages();

Edit: The flattenImages method has been deprecated & removed. Use

$im = $im->mergeImageLayers( imagick::LAYERMETHOD_FLATTEN );
Share:
11,095
Alfred
Author by

Alfred

I am a Full Stack developer and a DevOps Engineer, who always to learn from, and contribute to, the technology community. I was a beginner in programming once. What all I had was pieces of scattered and crude knowledge (don't know if i can call it knowledge) then. Later, I joined for Master of Computer Applications in a college and there, I got a great teacher. It was her, who taught me when and where to use 'while' and 'for' loops even.What all knowledge I have now, and what all achievements I've made till now, is only because of her. Compared to her, I am ashes. Hats off my dear teacher Sonia Abraham, you are the best of your kind. Sonia Abraham is a professor of the Department of Computer Applications, M.A College of Engineering, Mahatma Gandhi University

Updated on June 14, 2022

Comments

  • Alfred
    Alfred almost 2 years

    I have a php script to create jpg thumbnail of pdf as follows;

    <?php
    $file ="test.pdf";
    $im = new imagick(realpath($file).'[0]');
    $im->setImageFormat("jpg");
    $im->resizeImage(200,200,1,0);
    // start buffering
    ob_start();
    $thumbnail = $im->getImageBlob();
    $contents =  ob_get_contents();
    ob_end_clean();
    echo "<img src='data:image/jpg;base64,".base64_encode($thumbnail)."' />";
    ?>
    

    But the resulting jpg have black background instead of white.. How can I fix this??

  • Alfred
    Alfred almost 13 years
    i made some changes in my question.. have a look.. and your suggestion is not working..
  • carlgarner
    carlgarner almost 13 years
    @blasteralfred Could you provide access to a copy of your PDF as I believe the issue may be related to that, rather than the code you've now provided above. The updated code works without issue with PDF that I have.
  • Luke Vincent
    Luke Vincent over 6 years
    Where? Please give an answer in the format of the question. So in this case valid php.
  • vatavale
    vatavale about 6 years
    setCompressionQuality not actualy working in this situation. For change quality use setImageCompressionQuality
  • Chris
    Chris almost 3 years
    $im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE );