Image resize using GraphicMagick gm with 'convert' is resulting in inconsistent image - imagemagick

I have been trying to resize images using node.js gm module. It did work for most of the images.But when I try to resize few images, the background color and the text in the image is overlapping.My requirement is to create images of different width's without changing background color.
gm.command('convert')
.resize(100)
.gravity('Center')
.background('none')
.extent(100)
.toBuffer('JPG', function(err, buffer) {
if (err) {
next(err);
} else {
next(null, buffer, key);
}
});
Below is the original image
After resize the image is as below
I did try removing the background and tried adding transparent('white') but this didn't give me expected output. However when I use plain convert command line tool to resize it is working as expected.But my code is using node-js gm module and is deployed in AWS Lambda
Could someone help me in resolving this.

JPG does not support transparency. Try saving your output to PNG or TIFF. You might also try ImageMagick rather than GraphicsMagick. The following works fine for me in command line ImageMagick:
convert image.png -resize 100 -background none -gravity center -extent 100 result.png

Related

Overlaying multiple PNG images of different sizes on a canvas using ImageMagick

I want to overlay multiple PNG images of different sizes on a transparent canvas using ImageMagick. First I create a transparent canvas of some fixed size, say like
convert -size 1500x1000 canvas:transparent PNG32:canvas.png
Then I loop over my images in order to add each image to the canvas
convert canvas.png nthimage.png -gravity Center -geometry xResxYres+xcoord+ycoord -composite canvas.png
This works fine, but I may overlay as many as 10 pictures and I do this for thousands of n-tuples of images, so a faster solution would be appreciated. So my question: Can I also do this in one step instead of creating the canvas first and then adding a single image at a time?
Edit: I use ImageMagick 7.0.11-13 on macOS 10.15.7. I run ImageMagick from within a python script, so a file containing a list of input files can be generated if needed. For concreteness, say my input files are file_1.png up to file_n.png with sizes A1xB1 up to AnxBn and should be placed at coordinates +X1+Y1 up to +Xn+Yn with respect to the center of the canvas and the output file is output.png and should have size 1500x1000.
I really wouldn't recommend shelling out subprocesses from Python to call ImageMagick thousands of times. You'll just end up including too much process creation overhead per image, which is pointless if you are already running Python which can do the image processing "in house".
I would suggest you use PIL, or OpenCV directly from Python, and as your Mac is certainly multi-core, I would suggest you use multi-processing too since the task of doing thousands of images is trivially parallelisable.
As you haven't really given any indication of what your tuples actually look like, nor how to determine the output filename, I can only point you to methods 7 & 8 in this answer.
Your processing function for each image will want to create a new transparent image then open and paste other images with:
from PIL import Image
canvas = Image.new('RGBA', SOMETHING)
for overlay in overlays:
im = Image.open(overlay)
canvas.paste(im, (SOMEWHERE))
canvas.save(something)
Documentation here.

prevent black and white image auto convert to grayscale image

Start from ImageMagick 6.8, it will auto convert a black and white image(RGB) to be grayscale, which will make the altered image to be lighter than the original one. In ImageMagick 6.9, we can turn this feature off by using the command "-set colorspace:auto-grayscale=false". However, this option is not available in Wand latest version, is it a way I can turn off this feature by using Wand?
In addition, the command "-type truecolor" can also prevent Imagemagick convert the image to be grayscale. I try to set the image type to be "truecolor" by using "img.type = 'truecolor'" but the image is still converted to be grayscale, which is different behavior than the ImageMagick. Just want to know that is there something I did wrong or is there a way I can use to prevent black and white image to be converted into grayscale by using Wand?
In case anyone has the same issue.
You can use turn off auto-grayscale in wand.
with Image(filename='input.jpg') as img:
img.metadata['colorspace:auto-grayscale'] = 'false'

Why ImageMagick changes image brightness when I simply want to convert between JPG and PNG?

I wanted to batch-convert some JPG images to PNG, so I used the following ImageMagick command:
convert before.jpg after.png
However, things didn't go as smooth as I planned. See two images below - first is before.jpg, second is after.png:
You can see that the second one is quite darker than the original.
I'm using ImageMagick 6.9.9-19.
Opening JPEG image in GIMP and exporting it as PNG gives expected result - output image is identical to original.
What am I doing wrong?
Edit: re-saving after.png with GIMP also makes the image identical to original.
Edit: even after I saved after.png with GIMP, re-converting with ImageMagick breaks colors again (convert after-gimp.png after-gimp-and-im.png).
Edit: converting to sRGB or CMYK TIFF, or even again to JPG, does not give this problem. However, I still need PNG.
The two images you posted are identical according to IM 6.9.9.20 Q16 Mac OSX compare -metric rmse GBooF.jpg geDxn.png null: Which produces: 0 (0). It is possible your viewers may display jpg and png differently, since neither have an sRGB profile. Though, png is usually assumed to be sRGB.
Also my viewer shows both of your images as the same --- no difference, in your post on Mac Safari and using Mac Preview.
Try adding an sRGB profile to your jpg. Then convert.
convert GBooF.jpg -profile path2/sRGB.icc GBooF2.jpg
convert GBooF2.jpg GBooF2.png
See if those view the same.

ImageMagick 6.7.7 conversion from RGB PDF to CMYK PDF looks dark

I am using ImageMagick 6.7.7 on Ubuntu 14.04.2.
I am converting an RGB PDF to CMYK PDF and it looks dark. But it is working fine with ImageMagick 6.6.6.
I am using below command:
convert tp_rgb.pdf -verbose -density 300 -colorspace CMYK tp_cmyk.pdf
How can we fix that? Can any help me with this?
At version 6.7.6, ImageMagick started treating grayscale images without colorspace information as "linear" instead of "sRGB" by default, with the result that they looked darker. Later, the default was switched back to "sRGB" and a few related problems were fixed. Upgrading to version 6.8.9 or later will restore the original, expected behavior, where all images are handled as "sRGB" by default.

ImageMagick: Transparent Backgrounds for JPEG, not PNG

I'm using ImageMagick to convert PDF files to PNGs. (Lots of text, so I'd rather use PNG over JPEG.) I'm doing this on OS X, 10.8.2.
I tried using Ghostscript, then ImageMagick, as was done here and I got a gray background. I shortened it to one line, since ImageMagick can work with PDFs and tried this:
convert -background transparent -transparent white \
Background-Page01.pdf TestClearX1.png
I've tried that with PNG files and JPEG files. (And with and without -transparent white as well.)
If it's a JPEG, I can get a white background (which is probably clear, but in my viewer, I can't tell), but with a PNG, I always get a dark background. I thought about, as a test, trying to generate a BMP, then converting that to PNG, but it won't generate BMP files.
How can I get a transparent background for a PNG file?
And if that's not possible, since JPEG files are not good for text, is there a better alternative?
This isn't an answer, but the format of the comment section doesn't allow sensible formatting, so I am offering it here instead.
You alluded to the fact that Preview in OS X doesn't show transparency properly, and that is correct. To get around that, I made the following script, which overlays the files you want to view onto a checkerboard pattern like Photoshop does. I save it as preview and then use chmod +x preview on it to make it executable. Here is the script:
#!/bin/bash
################################################################################
# preview
# Preview images using OSX "open" but overlay images on top of checkerboard
# first so you can see transparency/transparent pixels, since Preview renders
# them grey :-(
################################################################################
for f in "$#"
do
base=$(basename "$f")
composite -compose Dst_Over -tile pattern:checkerboard "$f" "/tmp/$base"
open -g "/tmp/$base"
done
That enables you to do:
/.preview file1.png file2.gif
and the -g option also means Preview doesn't steal focus too :-)
So, instead of looking like this:
it looks like this:
There's two ways to export a PDF in LibreOffice, and one way does not provide any warnings. The other way provides a warning that PDF/A cannot have transparent objects. The problem is you're using PDF/A files that don't support transparent objects—this results in your PNG always having a background colour.

Resources