Difference between revisions of "ImageMagick"

From HalfgeekKB
Jump to navigation Jump to search
Line 29: Line 29:
  
 
The default operation: Src (the foreground) is copied over dst (the background).
 
The default operation: Src (the foreground) is copied over dst (the background).
 +
 +
To copy src behind dst, use <code>dst_over</code>.
  
 
<syntaxhighlight lang=bash>
 
<syntaxhighlight lang=bash>
 
 
# The method may be omitted here
 
# The method may be omitted here
 
composite -compose fg.png bg.png fg_on_bg.png
 
composite -compose fg.png bg.png fg_on_bg.png
 
# More verbosely
 
# More verbosely
 
composite -compose over fg.png bg.png fg_on_bg.png
 
composite -compose over fg.png bg.png fg_on_bg.png
 +
# Src behind dst
 +
composite -compose dst_over bg.png fg.png fg_on_bg.png
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Line 43: Line 46:
 
# More verbosely
 
# More verbosely
 
$bg->Composite(method => 'over', image => $fg);
 
$bg->Composite(method => 'over', image => $fg);
 +
 +
# Result is $fg
 +
$fg->Composite(method => 'dst_over', image => $bg);
 
</syntaxhighlight>
 
</syntaxhighlight>
  
====dst_over: Copy src behind dst====
+
====in: Src with alpha mask of dst applied====
 +
 
 +
<code>in</code> results in src seen through the alpha channel provided by dst.
  
The same as <code>over</code> but with roles reversed: src (now the background) is copied under dst (now the foreground). In Perl, this is a useful way to mutate the foreground instead of the background.
+
<code>dst_in</code> is the same, but swaps src and dst.
  
 
<syntaxhighlight lang=bash>
 
<syntaxhighlight lang=bash>
composite -compose dst_over bg.png fg.png fg_on_bg.png
+
composite -compose in image.png alpha-mask.png masked-image.png
 +
composite -compose dst_in alpha-mask.png image.png masked-image.png
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
<syntaxhighlight lang=perl>
 
<syntaxhighlight lang=perl>
# Result is $fg
+
# Result is whichever object whose method is called
$fg->Composite(compose => 'dst_over', image => $bg);
+
$alpha_mask->Composite(method => 'in', image => $image);
 +
$image->Composite(method => 'dst_in', image => $alpha_mask);
 
</syntaxhighlight>
 
</syntaxhighlight>
  
Line 101: Line 111:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
===Apply an alpha mask image to another image===
+
<code>-alpha shape</code> appears to have been added in a fairly recent version; for older versions this should work:
 
 
This is what the "in" compose method does.
 
  
 
<syntaxhighlight lang=bash>
 
<syntaxhighlight lang=bash>
composite -compose in src.png alpha-mask.png result.png
+
convert gray-mask.png '(' +clone ')' \
 +
-alpha off \
 +
-compose copy_opacity -composite \
 +
-fill white \
 +
-colorize 100% \
 +
alpha-mask.png
 
</syntaxhighlight>
 
</syntaxhighlight>

Revision as of 16:50, 2 January 2015

ImageMagick is a common image processing program (convert) and library (e.g. PerlMagick, aka Image::Magick).

Snippets

Composite

A Composite operation combines two images. Useful for such things as adding backgrounds to partially transparent images.

General

In the docs, the "src" (or "overlay") is combined with the "dst" (or "background") using a compose method.

composite -compose METHOD SRC.png DST.png COMPOSED.png

When using Perl, the operation is destructive of the dst image. Use the Clone method to operate on a copy while preserving the original.

# Result is $dst
$dst->Composite(compose => 'METHOD', image => $src);

# Result is $composed, $dst is unchanged
my $composed = $dst->Clone;
$composed->Composite(...);

over: Copy src on top of dst

The default operation: Src (the foreground) is copied over dst (the background).

To copy src behind dst, use dst_over.

# The method may be omitted here
composite -compose fg.png bg.png fg_on_bg.png
# More verbosely
composite -compose over fg.png bg.png fg_on_bg.png
# Src behind dst
composite -compose dst_over bg.png fg.png fg_on_bg.png
# Result is $bg
$bg->Composite(image => $fg);
# More verbosely
$bg->Composite(method => 'over', image => $fg);

# Result is $fg
$fg->Composite(method => 'dst_over', image => $bg);

in: Src with alpha mask of dst applied

in results in src seen through the alpha channel provided by dst.

dst_in is the same, but swaps src and dst.

composite -compose in image.png alpha-mask.png masked-image.png
composite -compose dst_in alpha-mask.png image.png masked-image.png
# Result is whichever object whose method is called
$alpha_mask->Composite(method => 'in', image => $image);
$image->Composite(method => 'dst_in', image => $alpha_mask);

New image filled with color

export COLOR=white
export WIDTH=800
export HEIGHT=600
convert -size ${WIDTH}x${HEIGHT} xc:${COLOR} filled.png
my $color = 'white';
my $width = 800;
my $height = 600;
my $filled = new Image::Magick size => "${width}x${height}";
$filled->Read("xc:$color");

New image the same size as an existing image

my $new_image = new Image::Magick size => join('x', $existing_image->Get('width','height'));

Fill the background of an existing (partly transparent) image with a color

my $bg_color = 'white';
my $bg = new Image::Magick size => join('x', $fg->Get('width','height'));
$bg->Read("xc:$bg_color");

# Either put the result in the new image (result $bg)
$bg->Composite(image => $fg);

# Or mutate the existing foreground image (result $fg)
$fg->Composite(compose => 'dst_over', image => $bg);

Change a grayscale image to an alpha mask image (white as opaque)

convert gray-mask.png -alpha shape alpha-mask.png

-alpha shape appears to have been added in a fairly recent version; for older versions this should work:

convert gray-mask.png '(' +clone ')' \
	-alpha off \
	-compose copy_opacity -composite \
	-fill white \
	-colorize 100% \
	alpha-mask.png