Suppose you have any image (PNG or JPG).
This image has a white background and I need to make this background transparent.
I have tried with these examples:
convert original.png -background none transparent.png
convert original.png -background white -flatten -alpha off transparent.png
but with no desirable results.
How can I make it?
IMPORTANT: Using convert
command-line.
I am using ImageMagick 6.6.9-7 on Ubuntu 12.04.
What worked for me was the following:
convert test.png -transparent white transparent.png
That changed all the white in the test.png to transparent.
I had the same problem. In which i have to remove white background from jpg/png image format using ImageMagick.
What worked for me was:
1) Convert image format to png: convert input.jpg input.png
2) convert input.png -fuzz 2% -transparent white output.png
This works for me:
convert original.png -fuzz 10% -transparent white transparent.png
where the smaller the fuzz %, the closer to true white or conversely, the larger the %, the more variation from white is allowed to become transparent
Solution
color=$( convert filename.png -format "%[pixel:p{0,0}]" info:- )
convert filename.png -alpha off -bordercolor $color -border 1 \
\( +clone -fuzz 30% -fill none -floodfill +0+0 $color \
-alpha extract -geometry 200% -blur 0x0.5 \
-morphology erode square:1 -geometry 50% \) \
-compose CopyOpacity -composite -shave 1 outputfilename.png
Explanation
This is rather a bit longer than the simple answers previously given,
but it gives much better results: (1) The quality is superior due
to antialiased alpha, and (2) only the background is removed as
opposed to a single color. ("Background" is defined as approximately
the same color as the top left pixel, using a floodfill from the
picture edges.)
Additionally, the alpha channel is also eroded by half a pixel to avoid halos. Of course, ImageMagick's morphological operations don't (yet?) work at the subpixel level, so you can see I am blowing up the alpha channel to 200% before eroding.
Comparison of results
Here is a comparison of the simple approach ("-fuzz 2% -transparent
white") versus my solution, when run on the
ImageMagick logo. I've flattened
both transparent images onto a saddle brown background to make the
differences apparent (click for originals).
Notice how the Wizard's beard has disappeared in the simple approach.
Compare the edges of the Wizard to see how antialiased alpha helps the
figure blend smoothly into the background.
Of course, I completely admit there are times when you may wish to use
the simpler solution. (For example: It's a heck of a lot easier to
remember and if you're converting to GIF, you're limited to 1-bit
alpha anyhow.)
mktrans shell script
Since it's unlikely you'll want to type this command repeatedly, I
recommend wrapping it in a script. You can download a BASH shell
script from github which
performs my suggested solution. It can be run on multiple files in a
directory and includes helpful comments in case you want to
tweak things.
bg_removal script
By the way, ImageMagick actually comes with a script called
"bg_removal"
which uses floodfill in a similar manner as my solution. However, the
results are not great because it still uses 1-bit alpha. Also, the
bg_removal script runs slower and is a little bit trickier to use (it
requires you to specify two different fuzz values). Here's an example of the output from bg_removal.
You can Use this to make the background transparent
convert test.png -background rgba(0,0,0,0) test1.png
The above gives the prefect transparent background
If you want to control the level of transparency you can use rgba. where a is the alpha. 0 for transparent and 1 for opaque. Make sure that final output file must have .png extension for transparency.
convert
test.png
-channel rgba
-matte
-fuzz 40%
-fill "rgba(255,255,255,0.5)"
-opaque "rgb(255,255,255)"
semi_transparent.png
Using ImageMagick, this is very similar to hackerb9 code and result, but is a little simpler command line. It does assume that the top left pixel is the background color. I just flood fill the background with transparency, then select the alpha channel and blur it and remove half of the blurred area using -level 50x100%. Then turn back on all the channels and flatten it against the brown color. The -blur 0x1 -level 50x100% acts to antialias the boundaries of the alpha channel transparency. You can adjust the fuzz value, blur amount and the -level 50% value to change the degree of antialiasing.
convert logo: -fuzz 25% -fill none -draw "matte 0,0 floodfill" -channel alpha -blur 0x1 -level 50x100% +channel -background saddlebrown -flatten result.jpg
Yep. Had this same problem too. Here's the command I ran and it worked perfectly:
convert transparent-img1.png transparent-img2.png transparent-img3.png -channel Alpha favicon.ico