Imagick JPEG to PNG conversion - php

I need to convert a JPEG Imagick image to PNG while maintaining the imageCompressionQuality of the JPEG image. I've tried using compositeimage as well as clone $image in order to achieve this, but both take the original quality (before the image compression of the JPEG file).
$image = new Imagick($image_name);
$image->resizeImage($imageWidth, $imageHeight, Imagick::FILTER_LANCZOS, 1);
$image->setImageFormat("jpeg");
$image->setImageCompression(imagick::COMPRESSION_JPEG);
$image->setImageCompressionQuality(00);
$image->stripImage();
METHOD 1:
$finalImage = new Imagick();
$finalImage->newImage($imageWidth, $imageHeight, "none");
$finalImage->compositeimage($image, Imagick::COMPOSITE_OVER, 0, 0);
$finalImage->setImageFormat("png");
echo $finalImage;
METHOD 2:
$finalImage = clone $image;
etc.
Is there any way to do this?

"Quality" settings are not part of JPEG. It is merely a shorthand some encoders use for selecting quantization tables.
There is no equivalent to quantization table selection in PNG. PNG is a lossless compression. What goes in is what comes out for all settings.

Figured out a way to make this work - I used writeImage to write a temp file onto the server, then created a new Imagick object from the temp object. This preserved the compression of the jpg file.
$image->writeImage($image_name . "temp.jpg");
$finalImage = new Imagick($image_name . "temp.jpg");
$finalImage->setImageFormat("png");
echo $finalImage;
unlink($image_name . "temp.jpg");

Related

Turn off auto-grayscale when saving to png with PHP Imagick

When saving a RGB image to a PNG with Imagick. The image gets saved automatically in grayscale when it contains only grey pixels. I understand this a default stetting, that can be overridden. I would like to save my image always in RGB as a default. How do I turn Imagick's auto-grayscale off with PHP/Imagick? I wrote this code.
$im = new Imagick();
$im->setResolution(288,288);
$im->setColorspace(Imagick::COLORSPACE_SRGB);
$im->setBackgroundColor(new ImagickPixel('transparent'));
$im->readImage($orgDataPath);
$im->setoption("colorspace:auto-grayscale", "off");
$im->setImageType(Imagick::IMGTYPE_TRUECOLOR);
$im->trimImage(0);
$im->setImageFormat("png");
$im->writeImage($pngPrint.".png");
// cleanup
$im->clear();
$im->destroy();

PHP - convert EPS to PNG using Imagick

I am trying to convert eps to png image using imagick.This is the code i am using.
$path = getcwd().'/uploads/1488/791/586/imprint_option_1A.eps';
$save_path = getcwd().'/uploads/1488/791/586/imprint_option_2E_c.png';
$image = new Imagick();
$image->readimage($path);
$image->setBackgroundColor(new ImagickPixel('transparent'));
$image->setResolution(300,300);
$image->scaleImage(600, 270);
$image->setImageFormat("png");
$image->writeImage($save_path);
but the transparency is not working i got image with white background ( Result image ). and when we scale image it loses clarity..
Any idea ?
Here is my eps file https://drive.google.com/open?id=0Bwq4DvGGbHVfT0FYTE94WW5GTnc
The function setResolution should be called before reading the image. Thus
$image = new Imagick();
$image->setResolution(1200, 1200);
$image->readImage($path);
should do it. As for the transparency, can you try to get the input as sRGB instead of CMYK? If I convert first the input file to pdf with epstopdf and then use this converted file in the PHP script, it produces a transparent PNG file.

Converting svg to png generates blank image

I have went through a lot of similar questions.i couldn't find an answer to my problem.
I have an svg image. I'm trying to convert it into a png image.
I have been using a 300dpi image as background of svg image.Now i have changed it into 600dpi. After that imagick returns an empty png image.
$svg=path to svg;
$im = new Imagick();
$im->readImageBlob($svg);
$im->setImageFormat("png32");
$im->setImageCompressionQuality(100);
$im->resizeImage(720, 445, imagick::FILTER_LANCZOS, 1);
$base64=base64_encode($im);
$im->clear();
$im->destroy();
return 'data:image/jpg;base64,' . $base64; //returns blank png
What am i missing here? Do i have to include any libraries??
PHP VERSION: 7
IMAGICK VERSION: ImageMagick 6.8.9-9
Looking at the documentation of Imagick::readImageBlob
Reads image from a binary string
this seems not the correct method for reading from a file path.
You should either use Imagick::readImage
Reads image from filename
$im = new Imagick();
$im->readImage($svg);
or the constructor Imagick::__construct
Imagick::__construct ( mixed $files )
Creates an Imagick instance for a specified image or set of images.
$im = new Imagick($svg);

PHP - convert all images to jpg using Imagick - bad quality

I found more topics from this web site about quality with Imagick but nothing help me...
I have to save all images as JPG. I created this script:
$image_url = 'http://limuzynamercedes.pl/wp-content/uploads/2014/06/3.png';
$image_code = file_get_contents($image_url);
$img = new Imagick();
$img -> readImageBlob($image_code);
$img->setResolution(300, 300);
$d = $img->getImageGeometry();
$img->cropImage($d['width'],($d['height']-120), 0,0);
$img->setImageFormat('jpeg');
$img->setImageCompression(imagick::COMPRESSION_JPEG);
$img->setCompressionQuality(100);
$img->writeImage('read.jpg');
$img->clear();
echo '<img src="read.jpg?'.time().'">';exit;
Here is original image: http://limuzynamercedes.pl/wp-content/uploads/2014/06/3.png
and here is image which was converted by my script: http://s5.ifotos.pl/img/demo1jpg_saeaxqx.jpg
Where is a problem? Why this image is always convert in bad quality?
Thanks.
The image is not in "bad quality" (there is no blurry areas found), but the difference between 2 images is caused by transparent PNG to JPG conversion.
Before you crop the image, add these two lines:
// set background to white (Imagick doesn't know how to deal with transparent background if you don't instruct it)
$img->setImageBackgroundColor(new ImagickPixel('white'));
// flattens multiple layers
$img = $img->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);

PNGs resized with Imagick are black...what is the missing step in PHP?

When I use Imagick in PHP to resize PNG images, the output images are black. This is not the case when I resize JPGs; the PHP procedure (provided below) works perfectly for JPGs, so I suspect there's a missing step when processing PNG files.
I've first tested the conversion using ImageMagick on my local computer using this command:
convert x.png -resize 528 -filter Lanczos x-resized.png
...and it works; the resulting PNG file displays and is resized appropriately.
However, when I attempt to do the same on my server (both localhost and live), the result is a black image.
The PHP code I'm using is:
$source = "x.png" // I provide the complete path in my routine, etc.
$destination = "x-resized.png" // likewise.
$im = new Imagick();
$im->readImage($source);
$im->setImageFormat("png");
$im->resizeImage(528, null, Imagick::FILTER_LANCZOS, 1);
$im->writeImage($destination);
$im->clear();
What am I doing incorrectly?

Categories