summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Wey2011-09-17 16:36:53 +0200
committerMike Wey2011-09-17 16:36:53 +0200
commit3535eb0887b805ce8e4538b3e91c290fbb596006 (patch)
tree0409dc3d85267dc83fb0e5fb88e98759b40944d5
parent5c5587992fa5bfc27e315c419d67c15872ce0be0 (diff)
Add dmagick.Array
-rw-r--r--dmagick/Array.d171
-rw-r--r--dmagick/Image.d24
-rw-r--r--docs/dmagick.ddoc1
3 files changed, 196 insertions, 0 deletions
diff --git a/dmagick/Array.d b/dmagick/Array.d
new file mode 100644
index 0000000..b80902b
--- /dev/null
+++ b/dmagick/Array.d
@@ -0,0 +1,171 @@
+/**
+ * Copyright: Mike Wey 2011
+ * License: zlib (See accompanying LICENSE file)
+ * Authors: Mike Wey
+ *
+ * This module contains functions that operate on a array or list of images.
+ */
+
+module dmagick.Array;
+
+import dmagick.Exception;
+import dmagick.Geometry;
+import dmagick.Image;
+import dmagick.Options;
+
+import dmagick.c.blob;
+import dmagick.c.constitute;
+import dmagick.c.image : MagickCoreImage = Image;
+
+/**
+ * Read a multi frame Image by reading from the file or
+ * URL specified by filename.
+ */
+Image[] readImages(string filename)
+{
+ Options options = new Options();
+ options.filename = filename;
+
+ return readImages(options);
+}
+
+///ditto
+Image[] readImages(string filename, Geometry size)
+{
+ Options options = new Options();
+ options.filename = filename;
+ options.size = size;
+
+ return readImages(options);
+}
+
+/**
+ * Reads a multi frame Image from an in-memory blob.
+ * The Blob size, depth and magick format may also be specified.
+ *
+ * Some image formats require size to be specified,
+ * the default depth Imagemagick uses is the Quantum size
+ * it's compiled with. If it doesn't match the depth of the image
+ * it may need to be specified.
+ *
+ * Imagemagick can usualy detect the image format, when the
+ * format can't be detected a magick format must be specified.
+ */
+Image[] readImages(void[] blob)
+{
+ return readImages(blob, new Options());
+}
+
+///ditto
+Image[] readImages(void[] blob, Geometry size)
+{
+ Options options = new Options();
+ options.size = size;
+
+ return readImages(blob, options);
+}
+
+///ditto
+Image[] readImages(void[] blob, Geometry size, size_t depth)
+{
+ Options options = new Options();
+ options.size = size;
+ options.depth = depth;
+
+ return readImages(blob, options);
+}
+
+///ditto
+Image[] readImages(void[] blob, Geometry size, size_t depth, string magick)
+{
+ Options options = new Options();
+ options.size = size;
+ options.depth = depth;
+ options.magick = magick;
+ //Also set the filename to the image format
+ options.filename = magick ~":";
+
+ return readImages(blob, options);
+}
+
+///ditto
+Image[] readImages(void[] blob, Geometry size, string magick)
+{
+ Options options = new Options();
+ options.size = size;
+ options.magick = magick;
+ //Also set the filename to the image format
+ options.filename = magick ~":";
+
+ return readImages(blob, options);
+}
+
+/**
+ * Create an ImageMagick ImageList.
+ */
+private void linkImages(Image[] images)
+{
+ for ( int i = 0; i < images.length; i++ )
+ {
+ if ( i > 0 )
+ images[i].imageRef.previous = images[i-1].imageRef;
+
+ if ( i < images.length-1 )
+ images[i].imageRef.next = images[i+1].imageRef;
+ }
+}
+
+/**
+ * Actual implementation for files.
+ */
+private Image[] readImages(Options options)
+{
+ Image[] images;
+
+ MagickCoreImage* image = ReadImage(options.imageInfo, DMagickExceptionInfo());
+
+ do
+ {
+ images ~= new Image(image);
+
+ image = image.next;
+ }
+ while ( image !is null )
+
+ return images;
+}
+
+/**
+ * Actual implementation for blobs.
+ */
+private Image[] readImages(void[] blob, Options options)
+{
+ Image[] images;
+
+ MagickCoreImage* image =
+ BlobToImage(options.imageInfo, blob.ptr, blob.length, DMagickExceptionInfo());
+
+ do
+ {
+ images ~= new Image(image);
+
+ image = image.next;
+ }
+ while ( image !is null )
+
+ unlinkImages(images);
+
+ return images;
+}
+
+/**
+ * Destroy the ImageMagick ImageList.
+ */
+private void unlinkImages(Image[] images)
+{
+ foreach ( image; images )
+ {
+ image.imageRef.next = null;
+ image.imageRef.previous = null;
+ }
+}
diff --git a/dmagick/Image.d b/dmagick/Image.d
index 9c4b2a8..c191a2b 100644
--- a/dmagick/Image.d
+++ b/dmagick/Image.d
@@ -2134,6 +2134,18 @@ class Image
MagickCoreImage* image = ReadImage(options.imageInfo, DMagickExceptionInfo());
+ //Make sure a single image (frame) is read.
+ if ( image.next !is null )
+ {
+ MagickCoreImage* nextImage;
+
+ nextImage = image.next;
+ image.next = null;
+ nextImage.previous = null;
+
+ DestroyImageList(nextImage);
+ }
+
imageRef = ImageRef(image);
}
@@ -2165,6 +2177,18 @@ class Image
MagickCoreImage* image =
BlobToImage(options.imageInfo, blob.ptr, blob.length, DMagickExceptionInfo());
+ //Make sure a single image (frame) is read.
+ if ( image.next !is null )
+ {
+ MagickCoreImage* nextImage;
+
+ nextImage = image.next;
+ image.next = null;
+ nextImage.previous = null;
+
+ DestroyImageList(nextImage);
+ }
+
imageRef = ImageRef(image);
}
diff --git a/docs/dmagick.ddoc b/docs/dmagick.ddoc
index c2af2d0..6435463 100644
--- a/docs/dmagick.ddoc
+++ b/docs/dmagick.ddoc
@@ -30,6 +30,7 @@ NAVIGATION =
<h2>dmagick</h2><br>
$(LIST
+ $(NAVLINK Array),
$(NAVLINK Color),
$(NAVLINK ColorCMYK),
$(NAVLINK ColorGray),