ImageMagick 6.0.0: News
ImageMagick Studio LLC announces the release of ImageMagick
6.0.0.
ImageMagick 6.0.0 is a robust collection of tools and libraries
offered under a usage license to read, write, and manipulate an
image in many image formats (over 89 major formats) including
popular formats like TIFF, JPEG, PNG, PDF, PhotoCD, and GIF. With
ImageMagick you can create images dynamically, making it suitable
for Web applications. You can also resize, rotate, sharpen, color
reduce, or add special effects to an image or image sequence and
save your completed work in the same or differing image format.
Image processing operations are available from the command line, or
from the C, C++, Perl, Java, PHP, Python, or Ruby programming
languages. A high-quality 2D renderer is included, which provides a
subset of SVG capabilities. ImageMagick's focus is on performance,
minimizing bugs, and providing stable APIs and ABIs.
Here are just a few examples of what ImageMagick can do:
- Convert an image from one format to another
(e.g. TIFF to JPEG)
- Resize, rotate, sharpen, color reduce, or add
special effects to an image
- Create a montage of image
thumbnails
- Create a transparent image suitable for use on
the Web
- Turn a group of images into a GIF animation
sequence
- Create a composite image by combining several
separate images
- Draw shapes or text on an image
- Decorate an image with a border or
frame
- Describe the format and characteristics of an
image
ImageMagick is copyrighted by ImageMagick Studio LLC, a
nonprofit organization dedicated to making software imaging
solutions freely available. ImageMagick is available for free, may
be used to support both open and proprietary applications, and may
be redistributed without fee.
While the API in 6.0.0 is 100% compatible with 5.5.7, thanks to
Anthony Thyssen the command line processing has improved
significantly as detailed here:
http://www.cit.gu.edu.au/~anthony/graphics/imagick6/cmdline/
Other major improvements in ImageMagick 6.0.0 include
- MagickWand API, a higher level C interface to
the ImageMagick methods.
- Increased stability. The library was checked
and cross-checked with splint and valgrind to eliminate security
vulnerabilities and common programming mistakes as well as ensure
no memory leaks.
- A new -fx option to apply a mathematical
expression to an image list from the command
line.
- Algorithms were improved to reduce processing
requirements resulting in a significant speed-up over previous
releases.
- All regression tests pass at Q8, Q16, and Q32
on a variety of platforms including Linux, Solaris, FreeBSD, Mac OS
X, and Windows.
- The composite methods have been corrected to
precisely conform to the SVG standard.
- New image comparison utility,
`compare'.
- Better support for CMYK image
workflow.
- New string handling methods to help prevent
potential buffer overflow problems.
- Error reporting has more detail to help
identify the cause of a particular problem.
Other significant changes since the ImageMagick 5.5.7 release,
include:
Bug fixes:
- Configure files in your current directory, at
MAGICK_HOME, or at ~/.magick are read in addition to the ones in
the system directory (.e.g you can specify your private font files
in ~/.magick/type.mgk).
- A semaphore was being reset while not under a
spinlock.
- Configure script fix ensures that -lfpx is not
supplied to the C compiler during subsequent tests since this fails
on some systems.
- Fix for East and West gravity
computations.
- System error reports (errno) associated with an
exception are now correctly obtained from the existing context when
the exception was thrown rather than the context of the reporting
method.
- JNG encoder fix. Files were being written with
incorrect alpha sample value in the header. These can be repaired
by reading them into ImageMagick 6.0.0 and rewriting
them.
- BMP reader fix to avoid unnecessary rejection
of some old uncompressed Windows 2.X and OS/2
BMPs.
- XPM fix to module registration.
- PSD fix for index calculation when QuantumDepth
> 8.
- Validate that geometry specifications
(unrecognized symbols are rejected).
- SGI fix to save compression type while
writing.
- The reported image magick string is now always
that of the original input file (it was sometimes being reported as
the format produced by an intermediate delegate
program).
- Fixes to color profiling of CMYK
images.
- Memory leak fixed in
DrawClipPath().
- Arc drawing is fixed.
- Fixed possible infinite loop in Windows thread
locking.
- Scaling of colors was slightly incorrect for
16-bit BMP, AVI, DIB, and TIM datastreams.
- Fixed any/all memory leaks identified by
valgrind.
Performance improvements:
- Texture tiling is now 7X faster.
- Image processing speed improvements due to an
improved pixel cache algorithm.
Utilities enhancements:
- Added the -tint option: applies a color vector
to each pixel in the image. The length of the vector is 0 for black
and white and at its maximum for the midtones. The vector weighting
function is f(x)=(1-(4.0*((x-0.5)*(x-0.5)))).
- Added support for dealing with image channels.
In addition to the -fx option you can use -channel to operate on a
particular channel for -level, -gamma, -threshold, and -negate.
Additional channel operators will be added in the next
release.
- For Unix, 'identify -list configure' lists
configure and build parameters.
- Error messages have been enhanced to display
greater detail. Use -debug Exception to trace the exact location
within the ImageMagick source of a particular
error.
- Added -orient option to set the image
orientation.
- Improvements to the image profiling and
clipping (new -clip-path option).
- Added 'Save' option to animate program
menu.
- The -define option is added in order to support
supplying additional options to coders without needing to add
additional command line options or structure
members.
- The output of 'identify -verbose' now displays
EXIF data (if present).
- The -sampling-factor option now accepts as many
HxV pairs as there are JPEG components. Omitted ones default to
1x1.
- Wildcard filename handling is enhanced to work
with a subimage specification (e.g. '*.miff[2]').
- Added new image comparison utility `compare'
(e.g. compare -metric PSNR image reconstructed
difference).
- Added -separate to the convert program to
separate a channel from an image and return a grayscale
image.
- New postfix command line operation. See
http://www.cit.gu.edu.au/~anthony/graphics/imagick6/cmdline/. There
is legacy support so existing scripts do not break.
- Added new -annotate option for the convert and
mogrify program (e.g. -annotate +100+100 'Some text', -annotate
30x30+100+100 'Some text').
- Added -top, -delete, -insert, and -swap as
options to the convert program to enhance image list
manipulation.
- Added the -radial-blur option to the convert
and mogrify programs.
- Added -family, -stretch, -style, and -weight to
the convert program. These options are used in conjunction with
-font to specify font attributes.
- Added the -splice option to splice the
background color into an image.
- Added the -posterize option to reduce the image
to a limited number of color levels.
- Added explicit option grouping to the convert
command. Option grouping overrides the default behavior and applies
any options to images between the parentheses, for
example:
convert \( 1.png 2.png -append \) \( 3.png 4.png -append \) \
+append image.png
returns
+---+---+
| 1 | 3 |
+---+---+
| 2 | 4 |
+---+---+
* Added -fx `expression' as a new special effects operator:
convert u.png v.png -fx 'expression' result.png
The syntax is `-fx 'expression'', and will work with the current image
sequence in memory, with the resulting image replacing that sequence.
Typically the source image sequence is only one or two images.
For example, extract the matte channel of the image (this is the negative
to what is commonly thought of as the alpha channel mask of the image)
convert drawn.png -fx 'a' +matte matte.png
Mathematic operators include
constants: MaxRGB, Opaque, Transparent, Pi
standard operators: +, -, *, etc.
math function name:
abs(), acos(), asin(), atan(), cos(), exp(), log(), ln(), max(),
min(), rand(), sin(), sqrt(), tan()
color names: red, cyan, black, etc.
symbols:
u = first image in sequence
v = second image in sequence
i = current columns offset
j = current row offset
p = pixel to use (absolute or relative to current pixel)
w = width of this image
h = height of this image
r = red value (from RGBA), of a specific or current pixel
g = green ''
b = blue ''
a = alpha ''
c = cyan value of CMYK color of pixel
y = yellow ''
m = magenta ''
k = black ''
intensity = pixel intensity
The image source can be specified using an image index, starting
at zero for the first image, (eg: `u[3]' is the fourth image in the
image sequence). A negative image index counts images from the end
of the current image sequence, so `u[-1]' refers to the last image
in the sequence.
Without an index `u' or `v' represent the first and second. image of
the sequence. If no image is specified the `u' image is used.
For example to reduce the intensity of the red and green channels by
50%, use
convert image.png -channel red,green -fx 'u/2.0' image.jpg
The pixels are processed one at a time, but a different pixel of a image
can be specified with a `pixel' index. For example...
p[-1].g Green value of pixel to the immediate left of current
p[-1,-1].r Red value, diagonally left and up from current pixel
To specify an absolute position, use braces, rather than brackets
p{12,34}.b is the blue pixel at position 12,34
The other symbols specify the value you wish to retrieve.
A pixel outside the boundary of the image has a value dictated by the
-virtual-pixel setting.
The -channel setting can be used to specify the output channel of the
result. If no channels have been set the default is just the RGB
(or CMYK) channels. The alpha channel will be left as is.
For example, suppose you want to replace the red channel of alpha.png
with the average of the green channels from the images alpha.png and
beta.png:
convert alpha.png beta.png -channel red -fx '(u.g+v.g)/2' gamma.png
Note that all the original images in the current image sequence are
replaced by the updated `alpha.png' image.
* Added the -evaluate method option to the convert program. Use it to
apply an an arithmetic, relational, or logical operator to an image.
These operations can be used to lighten or darken an image, to increase
or decrease constrast an an image, or to produce the "negative" of an
image.
Coder additions/improvments:
- The META coder supports wide characters for the
IPTC and 8BIM formats.
- The XTRN coder now supports wide
characters.
- The MAGICK coder provides access to a large
number of images (derived from XFig) suitable for use as patterns,
or as test images.
- The PATTERN coder now returns an image pattern
tiled to size.
- Reading and writing compressed SVG (SVGZ) is
now supported.
- The TXT coder now observes depth when
writing.
- The JPEG coder now estimates the original JPEG
quality and sampling factors and uses these values when writing a
JPEG image unless overwridden with the -quality option.
- The JPEG-2000 coder now supports all Jasper
library arguments (e.g. -define jp2:rate=0.5).
- Added CIELab color support for TIFF and PSD
images.
- The TIFF coder now outputs colormapped images
with 1, 2, and 4 bits per sample in order to provide much smaller
file sizes for images with very few colors.
- Added support for the Cineon, Dot, and SCR
image formats.
- The WPG coder now renders embedded
WMFs.
- The PS3 coder is completely re-written to work
much better and support more features (see
ChangeLog).
- Added EPT2 and EPT3 image types which embeds
Postscript level II and Postscript level III
repectively.
- The XC image format now accepts a CMYK color
specification (e.g. -size 100x100
xc:'cmyk(100,100,100,50)'.
- Modified the AVI coder to support MJPG
compression.
- Added a resample element to the MSL
coder.
Code/structure enhancements:
- Improved handling of image profiles, including
ICC, IPTC, EXIF and XMP. Profiles are now conveniently stored in a
hashmap structure. The color_profile and iptc_profile members of
the Image structure are still maintained for backwards
compatibility, however, we encourage you to use the new
PutImageProfile(), GetImageProfile(), and DeleteImageProfile()
methods.
- Error handling has been improved and validated
through testing. Some errors were being lost, unnecessarily
ignored, or reported as something else entirely.
- The number of error text messages to be
maintained has been reduced by consolidating similar
messages.
- The memory allocator methods have been replaced
with similar methods in order to eliminate warnings with GCC 3.3,
avoid accidentally casting away const. The previously-used
functions remain in the library for the purpose of
compatibility.
- <magick/xwindow.h> no longer depends on
magick_config.h defines.
- The text string localization code has been
replaced with a simpler version written by Bill
Radcliffe.
- Added key,value "define" APIs for internal
use.
- New MAGICK_CONFIGURE_PATH environment variable
allows the user to specify the search path for configuration (.mgk)
files.
API enhancements:
- The Wand API is a new high level interface to
the ImageMagick library. Feel free to review or use the API now but
keep in mind the interface may change between now and the release
date. See http://www.imagemagick.org/www/api.html for details. Note
that the ImageMagick DrawContext methods have been moved to the
Wand API. The methods had a caveat at the beginning of the source
module mentioning the API was not complete and to not rely on it.
Now you can!
- API definitions is no longer dependent on types
which vary in size (e.g. off_t) depending on large file compilation
options. This means that applications may now be compiled without
any special large file options and still work properly with the
library.
- Thrown exceptions (ExceptionInfo structure) now
include source file, source line, method name, and current system
error number.
- Added the InheritException() method to support
inheriting exceptions from one structure to
another.
- Added the ReplaceImageInList() method to
replace an image in an image list.
- Added the DrawPeekGraphicContext() method to
access the current DrawInfo structure in the drawing context
stack.
- New GetMagickList() method to conveniently
return the list of supported image formats.
- GetImageDepth() now returns an integral value
between 1 and QuantumDepth and is no longer limited to the values
8, 16, and 32.
- SetImageDepth() supports setting the image
depth to any integral value between 1 and
QuantumDepth.
- GetImageChannelDepth() supports retrieving the
modulus depth for a specified channel.
- GetImageChannelExtrema() supports retrieving
the extrema for the specified channel.
- GetImageChannelMean() supports retrieving the
mean and standard deviation for the specified
channel.
- Added option methods to properly parse options
and/or return their enumerated types.
- SetImageChannelDepth() supports setting the
modulus depth for a specified channel.
- ProfileImage is updated to handle alpha
channels and grayscale images.
- CompositeImage() now supports
CopyCyanCompositeOp, CopyMagentaCompositeOp, CopyYellowCompositeOp,
and CopyBlackCompositeOp, composition operators.
- Added support for returning the image histogram
in the C, C++, PerlMagick, and MagickWand API's.
- The semaphore.h header is no longer installed
or included in the API headers since these methods are private
interfaces.
- Added new TrimImage() method.
- New map option, P, for padding pixels and O,
for opacity when calling the ConstituteImage(),
ExportImagePixels(), and ImportImagePixels() methods.
- Cache views grow dynamically now (suggested by
Andrew Reid).
- Added EvaluateImageChannel() method to the API.
Use it to apply an an arithmetic, relational, or logical operator
to an image. These operations can be used to lighten or darken an
image, to increase or decrease constrast an an image, or to produce
the "negative" of an image.
- Added CombineImages() to combine several
grayscale images into a single image (e.g. convert -channel RGB
image.R image.G image.B -combine logo.png).
- The next/previous members of the configuration
list such as the font, color, and image format list are deprecated.
Instead use the new uniform Get????InfoList() method. For example,
use GetColorInfoList() to get a ColorInfo structure for each color
ImageMagick knows about. This change was thought necessary because
the next/previous pointers could change in a threaded environment
causing dangling pointers in some situations.
PerlMagick fixes/improvements:
- Adjusted a number of method option names so
that they match the documentation.
- PerlMagick options use the new ImageMagick
"options" API. This prevents options from getting out of sync with
their enumerated types.
- Memory leak fixed.
- Added efficient method for retrieving a group
of pixels (e.g.
$image->GetPixels(x=>0,y=>10,height=>1)).
- Reading files (e.g. GIF) via a file descriptor
is fixed.
- Get EXIF data with
$im->Get('%[EXIF:*]').
Build improvements:
- Configure only configures for C & C++
languages.
- Configure now does a better job of figuring out
how to build a threadsafe library across multiple operating
systems.
- Configure incorporates a new mmap()
test.
- Configure/build fixes for IBM's AIX operating
system.
- New -method-prefix configure option to add a
unique prefix for all Magick API methods.
- Updated autoconf to v2.59 and automake to
v1.7.9.
Windows-specific improvements:
- Truetype fonts are now found under Windows
98.
- Added a Visual C++ workspace for
ImageMagickObject.
- The static install package now uses the
"uninstalled" configuration so that it does not depend on the
Windows registry in order to run. This allows files from the static
install package to be copied to another computer without running an
installer.
- The executable search path is extended at
run-time to include the directory where the CORE DLLs reside in
order to ensure that they are found.
- Adding the -t option to VisualMagick configure
enables building all of the coders into one library in order to
save build time and simplify linkage.
- The XTRN coder now supports wide
characters.
- IMDisplay displays a checkerboard pattern
behind transparent images.
- Support is provided for issuing log messages to
the Windows standard logging system.
- Updated version of LCMS used for Windows build
to version 1.11.
- ImageMagick now compiles using Visual Studio
.NET 2003.
- Updated TIFF library to V3.6.1, LCMS version to
1.12, FreeType version to 2.1.5, JBIG-KIT to version 1.5, libpng to
version 1.2.5, libwmf to version 0.2.8.2, and zlib to version
1.2.1.
- Support for raw camera formats such as
CRW.
VMS-specific improvements:
- Patch to get ImageMagick working under OpenVMS
again.
License
- There is a new ImageMagick license (see
http://www.imagemagick.org/www/Copyright.html). It is a
Apache-style rather than BSD-style license to address the
frequently-asked-questions about what the license permits you to
do. It makes it more clear, in plain English, that ImageMagick is
free and that you can do pretty much whatever you want with
ImageMagick as long as you don't claim you wrote
it.
We would like to give special thanks to several people who have
contributed to ImageMagick, including:
Alexandra Christini - Validation, packaging, and release of
ImageMagick
6.0.0 source and binaries.
Kyle Shorter - PerlMagick enhancements and bug fixes.
Glenn Randers-Pehrson - Utilities, PNG, MNG, test scripts, documentation
enhancements.
Lars Skyum - PS3 coder and image profile enhancements.
Anthony Thyssen - ImageMagick 6.0.0 command line improvements and
validation suite.
Thanks to the folks at GraphicsMagick for numerous bug reports
and fixes.
And the many folks that contributed patches and enhancements as
described in http://www.imagemagick.org/www/Changelog.html.
|