php Imagemagick jpg black background
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 );
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, 2022Comments
-
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 almost 13 yearsi made some changes in my question.. have a look.. and your suggestion is not working..
-
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 over 6 yearsWhere? Please give an answer in the format of the question. So in this case valid php.
-
vatavale about 6 years
setCompressionQuality
not actualy working in this situation. For change quality usesetImageCompressionQuality
-
Chris almost 3 years$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE );