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);
Related
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();
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.
I am trying to convert svg to png image using imagick.This is the code i am using.
<?php
$usmap = 'http://yatnam.com/demo/vh/card2_1.svg';
$svg = file_get_contents($usmap);
$im = new Imagick();
//$im->setBackgroundColor(new ImagickPixel('transparent'));
$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();
?>
<img src="<?php echo 'data:image/jpg;base64,' . $base64;?>" />
My SVG images contain many other base64 encoded images..These images will not convert properly if it is not in png format.
To understand the issue exactly, please browse svg url directly.It is a image with Pink background.Now run my code. See same image in white background ..
Please help me to fix this issue..Thanks a lot in advance.
Do you have the access to the SVG file? Or are you able to download/save it locally, then change
xlink:href="data:image/jpeg;base64
in the 1st <image>
xlink:href="data:image/png;base64
and reference your local downloaded and changed copy?
The other way to show what you need to change is here:
I'm getting then the following:
UPDATE: I'd like to say once more that the SVG file you provided as example has the pink background as <image> with wrong MIME type, as I said in the comments. The problem you describe occurs because of that, no matter how reliable the image source is. You can check it by copying the base64 value of the first <image> in the SVG, decode it and save and then open it with any editor, you will see this:
which is a PNG, not JPEG signature. However, the first <image> in the SVG has image/jpeg - check it.
Now back to your claim that you can't change all the files. What I can propose is parsing SVG's XML in your script and replacing all MIME types with the correct ones. Be aware that this will require quite a lot memory as SVG's may be large. Note the new code between MODIFY THE MALFORMED SVG comments
$usmap = 'http://yatnam.com/demo/vh/card2_1.svg';
$svg = file_get_contents($usmap);
/////////////////// MODIFY THE MALFORMED SVG ///////////////////////
$dom = new DomDocument();
$dom->loadXML($svg);
foreach($dom->getElementsByTagName('image') as $image) {
$encoded = $image->attributes->getNamedItem('href')->value;
if(!empty($encoded)) {
$binary = base64_decode(substr($encoded,strpos($encoded,'base64,') + 7));
$info = getimagesizefromstring ($binary);
$image->setAttributeNS('http://www.w3.org/1999/xlink','xlink:href','data:'.$info['mime'].';base64,' . base64_encode($binary));
}
}
$svg = $dom->saveXML();
/////////////////// MODIFY THE MALFORMED SVG ///////////////////////
$im = new Imagick();
//$im->setBackgroundColor(new ImagickPixel('transparent'));
$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();
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");
When compressing a image with imagemagick on PHP the result turns pink.
$im = new Imagick();
$imgsrc = file_get_contents( $imgFilepathIn );
$im->readImageBlob($imgsrc);
$im->setImageColorspace(255);
$im->setImageCompression(Imagick::COMPRESSION_JPEG);
$im->setImageCompressionQuality(90);
$im->setImageFormat('jpeg');
$im->writeImage( $imgFilepathOut );
The problem is the default transparency color for the jpg (which is pink).
We can overcome this by explicitly setting a new transparency/background color.
$im->setBackgroundColor(new ImagickPixel('transparent'));
and it also seems like
$im->setImageColorspace(255);
could sometimes create problems