ImageMagick extend canvas with transparent background - background

convert input.png -extent 100x100 -gravity center -background white output.png
If the input is 50x50 the surrounding background is white. Can I somehow set this to transparent without declaring any color within input as transparent?

Use this instead:
convert \
input.png \
-background none \
-gravity center \
-extent 100x100 \
output.png
Note well: The order of the parameters is significant! (To convince yourself, just put -background none at the end of the parameters instead of the start...)
Updated: Thanks to #jesmith who noticed that the commandline I originally provided does no longer work as intended. More recent versions of convert additionally require that the -gravity center is called before -extent 100x100. (This was one of the changes introduced to one ImageMagick's most recent versions [at the time of originally writing this answer]).

Kurt's note is ironically spot on, order matters greatly. Kurt's command results in gravity not being applied to the extent, so the transparent 'border' will all be to the bottom and/or right of the image.
Moving gravity before extent will correctly create equal transparent 'borders' on all applicable sides.
convert input.jpg -background none -gravity Center -extent 100x50
output.png

Related

How to cut the png image as per the shape?

I have no experience on any image processing/editing tool. And I am doing a project, which requires me to use different shapes. I could create different shapes using visio. But however not able to get rid of white background behind. I need only shape not squared white background.Tried online out of my ways but not successfull.
Any help will be greatly appreciated.
Thanks,
Ganesh
Absolutely any image file has to be contained within a rectangular frame, this includes png and SVG.
Some image file formats can have what are called alpha channel backgrounds this allows you to see through transparent areas.
What you want to do is remove the white background to expose the alpha channel background in Photoshop (or similar tool) which can then be saved out as transparent.
For example in Photoshop:
If you open this image directly and have no other layers, double click the layer that says background and OK the confirmation box. This turns your flat image into a layered image
Select the magic wand tool and ensure you have a high tolerance set (3)
with the wand selected click the white area to bring up a marquee around your selection (the white background) and hit delete to remove it.
Your image should now have a chequered background which is the transparency showing through.
If you now go to file > save as and select png, your image should now be saved out with an alpha background.
Please note: There are further optimisations to make if this is for web, including file formats and file size but that is beyond the scope of this question but I encourage you to read up on the Gif format and it's restrictions, the difference between 8bit and 24bit pngs and how to use SVG.
You can do it pretty simply at the command-line using ImageMagick which is free and installed on most Linux distros and is available for OSX and Windows.
Basically, you want to make your whites transparent, so you would do
convert shape.png -transparent white result.png
If your whites are a little bit off-white, you could allow for some variation with a little fuzz as follows:
convert shape.png -fuzz 10% -transparent white result.png
I added the checkerboard background just so you can see it on StackOverflow's white background - it is not really there.
By the way, you may like to trim to the smallest bounding rectangle while you are there:
convert shape.png -fuzz 10% -transparent white -trim result.png
By the way, you can also draw your shapes with ImageMagick:
convert -size 150x150 xc: -fill none -stroke "rgb(74,135,203)" -draw 'stroke-width 90 ellipse 0,0 80,80 30,80' arc.png
See Anthony Thyssen's excellent examples here.

How to programmatically convert a PDF to grayscale using only black ink?

I'm trying to do it using Ghostscript:
gs -sOutputFile=gray.pdf \
-sDEVICE=pdfwrite \
-sColorConversionStrategy=Gray \
-dProcessColorModel=/DeviceGray \
-dNOPAUSE -dBATCH \
-dAutoRotatePages=/None \
color.pdf
But this doesn't result in using only black ink:
gs -q -o - -sDEVICE=inkcov gray.pdf
0.15365 0.15365 0.15365 0.09419 CMYK OK
I can make the conversion successfully using Adobe products but I'd like to be able to do this in a more automatable fashion.
This is (mostly) due to the way that inkcov works.
Your PDF file contains a transparency group with a DeviceRGB blending space. Note that this does not actually create any RGB output, it merely means that any objects which are blended must be done in RGB space. So anything not in DeviceRGB (eg all the objects in Gray) must first be converted to RGB, then blended, then converted to device space for rendering.
Because inkcov is a CMYK device, this means that the blended RGB objects must then be converted to CMYK. This results in less than perfect black. The PDF file does not in fact contain anything except gray colour specifications except for specifying the blending space of the transparency as RGB.
Looking at what Acrobat appears to do, it seems the simple solution is the one to go for, change the transparency blending space into DeviceGray as well. We know from previous experience that blending in different spaces does result in differences in rendering. On the other hand, so does changing the colour space of all the colour specifications......
Given time to do some more investigation I'll probably go down ths road in the next release.

Resizing without blur

I would like to know if there is a way to resize a picture while keeping it's pixelisation
convert ./TEST.png -resize 723x523 -compose Copy -gravity center -extent 723x523 -quality 92 ./TEST_big.png
Illustration from 20x20 to 100x100 here: image
`
Thanks
No one has answered this so I will put what I've done.
I've actually made a Python script who, for each pixel is making a square of n-pixels (10 for example). I'm making the output larger than the picture size I actually want(because I'm only doing squares) with GDAL and then resize it with imageMagick.

Setting transparency to different colored backgrounds imageMagick

I need to process some pdfs to transparent pngs the pdfs are text-only with colored backgrounds.
The pdfs have varied colored backgrounds, Some are lightgray, some are white etc. but they are consistent throughout the pdf.
Is there a way in imagemagick where I can identify the left topmost pixel color and pass the acquired color to the command -transparent "identifiedColor" while executing the imagemagick command?
Thanks !
Solution 1: matte floodfill
convert input.pdf -fill none -fuzz 10% -draw "matte 0,0 floodfill" output.png
Probably you'll have to adjust fuzz percentage
more details here: http://www.imagemagick.org/Usage/draw/#matte
Solution 2: color replace
I could not find a way to do it in a single command, but these two commands should work:
replace background color (taken from pixel[0,0]) with white:
convert input.pdf -fill white -draw "color 0,0 replace" temp.png
make white pixels transparent:
convert temp.png -transparent white output.png
more details here http://www.imagemagick.org/Usage/draw/#color
Tested with ImageMagick 6.6.0-1 on Windows

Margins Disappear In PDF -> PNG Conversion with ImageMagick

I'm having troubles with converting PDF to PNG in ImageMagick. I've used different variations, including using Ghostscript and piping the output to ImageMagic (as given here - which doesn't seem to work for me, so I have to save to a temp file instead of using a pipe). I've found this is working best for me:
convert -background transparent -density 150x150 Test.pdf Test-IMSoloOut.png
Here's a screenshot of the original PDF in my viewer (Preview, on OS X):
And when I convert it, I get this:
The problem is it's dropping the margins. I'm not clear whether it's making them transparent or what, but the formatting of the image looks sloppy without the margins.
I was given this to try:
convert -density 150x150 Test.pdf -gravity center -background transparent -extent 612x792 Test-Extras.png
And that just gives me one section of the page:
I tried adapting that and changed the 612x792 to 1275x1650, which would fit 150DPI multiplied by the size of the page (8.5" x 11"). When I did that, I got a large image, but, again, the margins were gone, like in the 2nd image above.
These images will be displayed in a Java program that will be displaying a number of pages, so the margins could vary (in other words, I can't just wrap a set border around the output, as seen in the 2nd image, since the border size will change in some images).
I've seen a number of hits on removing margins for PDF to PNG conversion, but they don't seem to provide anything to help me.
My guess is that, in the conversion process, the margins are converted to something transparent, so I tried adding "-transparent white" to the command line for convert, but it didn't help.
What can I do to either get the margins back or, if they're there and not visible, how can I get them to display? Basically I want the PNG file (image #2) to look like the PDF file with margins included (image #1).
I suspect I'm missing something obvious - I hope it's that easy.
How can I make sure the space in the margins show up?
I never got an exact answer, but one of the ImageMagick people was quite helpful with this. Basically, I needed to use the option "-extent" to specify how big the image was. Since I was using a different density than the default, I had to take that into account, too. The command line that worked was:
convert -density 150x150 InputFile.pdf -background white -units PixelsPerInch -density 150 -extent 1275x1650 OutputFile.png
The 1275x1650 comes from multiplying 150 (for the DPI) by 8.5" for the width and by 11 for the height.