diff options
Diffstat (limited to 'dmagick/c/distort.d')
| -rw-r--r-- | dmagick/c/distort.d | 269 |
1 files changed, 249 insertions, 20 deletions
diff --git a/dmagick/c/distort.d b/dmagick/c/distort.d index 98e800c..371d83d 100644 --- a/dmagick/c/distort.d +++ b/dmagick/c/distort.d @@ -7,46 +7,275 @@ import dmagick.c.magickVersion; extern(C) { - mixin( + version(D_Ddoc) { - string methods = "enum DistortImageMethod + /** + * The distortion method to use when distorting an image. + */ + enum DistortImageMethod { + /** */ UndefinedDistortion, + + /** + * Distort the image linearly by moving a list of at least 3 or + * more sets of control points (as defined below). Ideally 3 sets + * or 12 floating point values are given allowing the image to + * be linearly scaled, rotated, sheared, and translated, according + * to those three points. See also the related AffineProjection + * and ScaleRotateTranslateDistortion distortions. + * + * More than 3 sets given control point pairs (12 numbers) is least + * squares fitted to best match a lineary affine distortion. If only + * 2 control point pairs (8 numbers) are given a two point image + * translation rotation and scaling is performed, without any possible + * shearing, flipping or changes in aspect ratio to the resulting image. + * If only one control point pair is provides the image is only + * translated, (which may be a floating point non-integer translation). + * + * This distortion does not include any form of perspective distortion. + */ AffineDistortion, + + /** + * Linearly distort an image using the given Affine Matrix of 6 pre-calculated + * coefficients forming a set of Affine Equations to map the source + * image to the destination image. + * + * Sx,Rx,Ry,Sy,Tx,Ty + */ AffineProjectionDistortion, + + /** + * Distort image by first scaling and rotating about a given + * 'center', before translating that 'center' to the new location, + * in that order. It is an alternative method of specifying a + * 'Affine' type of distortion, but without shearing effects. It + * also provides a good way of rotating and displacing a smaller + * image for tiling onto a larger background (IE 2-dimensional + * animations). + * + * The number of arguments determine the specific meaning of each + * argument for the scales, rotation, and translation operations. + * $(TABLE + * $(HEADERS #, arguments meaning ) + * $(ROW 1:, $(COMMA Angle_of_Rotation )) + * $(ROW 2:, $(COMMA Scale Angle )) + * $(ROW 3:, $(COMMA X,Y Angle )) + * $(ROW 4:, $(COMMA X,Y Scale Angle )) + * $(ROW 5:, $(COMMA X,Y ScaleX,ScaleY Angle )) + * $(ROW 6:, $(COMMA X,Y Scale Angle NewX,NewY )) + * $(ROW 7:, $(COMMA X,Y ScaleX,ScaleY Angle NewX,NewY )) + * ) + * + * This is actually an alternative way of specifying a 2 dimensional + * linear 'Affine' or 'AffineProjection' distortion. + */ ScaleRotateTranslateDistortion, + + /** + * Perspective distort the images, using a list of 4 or more sets of + * control points (as defined below). More that 4 sets (16 numbers) of + * control points provide least squares fitting for more accurate + * distortions (for the purposes of image registration and panarama + * effects). Less than 4 sets will fall back to a 'Affine' linear distortion. + * + * Perspective Distorted images ensures that straight lines remain straight, + * but the scale of the distorted image will vary. The horizon is + * anti-aliased, and the 'sky' color may be set using the -mattecolor setting. + */ PerspectiveDistortion, + + /** + * Do a Perspective distortion biased on a set of 8 pre-calculated coefficients. + * If the last two perspective scaling coefficients are zero, the remaining + * 6 represents a transposed 'Affine Matrix'. + */ PerspectiveProjectionDistortion, + + /** + * Bilinear Distortion, given a minimum of 4 sets of coordinate pairs, + * or 16 values (see below). Not that lines may not appear straight + * after distortion, though the distance between coordinates will + * remain consistent. + * + * The BilinearForward is used to map rectangles to any quadrilateral, + * while the BilinearReverse form maps any quadrilateral to a rectangle, + * while preserving the straigth line edges in each case. + * + * Note that BilinearForward can generate invalid pixels which will be + * colored using the -mattecolor color setting. Also if the quadraterial + * becomes 'flipped' the image may dissappear. + * + * There are future plans to produce a true Bilinear distortion that will + * attempt to map any quadrilateral to any other quadrilateral, + * while preserving edges (and edge distance ratios). + */ BilinearForwardDistortion, + + /** + * ditto + */ BilinearDistortion = BilinearForwardDistortion, + + /** + * ditto + */ BilinearReverseDistortion, + + /** + * + */ PolynomialDistortion, + + /** + * Arc the image (variation of polar mapping) over the angle given around a circle. + * $(TABLE + * $(HEADERS Argument, Meaning) + * $(ROW arc_angle, The angle over which to arc the image side-to-side) + * $(ROW rotate_angle, Angle to rotate resulting image from vertical center) + * $(ROW top_radius, Set top edge of source image at this radius) + * $(ROW bottom_radius, Set bottom edge to this radius (radial scaling)) + * ) + * + * The resulting image is always resized to best fit the resulting image, while + * attempting to preserve scale and aspect ratio of the original image as much + * as possible with the arguments given by the user. All four arguments will be + * needed to change the overall aspect ratio of an 'Arc'ed image. + * + * This a variation of a polar distortion designed to try to preserve the aspect + * ratio of the image rather than direct Cartesian to Polar conversion. + */ ArcDistortion, + + /** + * Like ArcDistortion but do a complete Cartesian to Polar mapping of the image. + * that is the height of the input image is mapped to the radius limits, while + * the width is wrapped around between the angle limits. + * + * Arguments : Rmax,Rmin CenterX,CenterY, start,end_angle + * + * All arguments are optional. With Rmin defaulting to zero, the center to the + * center of the image, and the angles going from -180 (top) to +180 (top). If + * Rmax is given the special value of '0', the the distance from the center to + * the nearest edge is used for the radius of the output image, which will ensure + * the whole image is visible (though scaled smaller). However a special value of + * '-1' will use the distance from the center to the furthest corner, This may + * 'clip' the corners from the input rectangular image, but will generate the + * exact reverse of a 'DePolar' with the same arguments. + */ PolarDistortion, - DePolarDistortion,"; - - static if ( MagickLibVersion >= 0x671 ) - { - methods ~= "Cylinder2PlaneDistortion, - Plane2CylinderDistortion,"; - } - - methods ~= " + + /** + * Uses the same arguments and meanings as a Polar distortion but generates the + * reverse Polar to Cartesian distortion. + * + * The special Rmax setting of '0' may however clip the corners of the input image. + * However using the special Rmax setting of '-1' (maximum center to corner distance) + * will ensure the whole distorted image is preserved in the generated result, so that + * the same argument to 'Polar' will reverse the distortion re-producing the original. + * Note that as this distortion requires the area resampling of a circular arc, which + * can not be handled by the builtin EWA resampling function. As such the normal EWA + * filters are turned off. It is recommended some form of 'super-sampling' image + * processing technique be used to produce a high quality result. + */ + DePolarDistortion, + + /** */ + Cylinder2PlaneDistortion, + + /** */ + Plane2CylinderDistortion, + + /** + * Given the four coefficients (A,B,C,D) as defined by Helmut Dersch, perform a barrell or + * pin-cushion distortion appropriate to correct radial lens distortions. That is in + * photographs, make straight lines straight again. + * + * Arguments : A B C [D [X,Y]] $(BR) + * or Ax Bx Cx Dx Ay By Cy Dy [X,Y] $(BR) + * So that it forms the function $(BR) + * Rsrc = r * ( A*r³ + B*r² + C*r + D ) + * + * Where X,Y is the optional center of the distortion (defaulting to the center of the image). + * The second form is typically used to distort images, rather than correct lens distortions. + */ BarrelDistortion, + + /** + * This is very simular to BarrelDistortion with the same set of arguments, and argument handling. + * However it uses the inverse of the radial polynomial, so that it forms the function + * + * Rsrc = r / ( A*r³ + B*r² + C*r + D ) + * + * Note that this is not the reverse of the Barrel distortion, + * just a different barrel-like radial distortion method. + */ BarrelInverseDistortion, - ShepardsDistortion,"; + + /** + * Distort the given list control points (any number) using an Inverse Squared Distance + * Interpolation Method (Shepards Method). The control points in effect do 'localized' + * displacement of the image around the given control point (preserving the look and the + * rotation of the area near the control points. For best results extra control points + * should be added to 'lock' the positions of the corners, edges and other unchanging + * parts of the image, to prevent their movement. + * + * The distortion has been likened to 'taffy pulling' using nails, or pins' stuck in a + * block of 'jelly' which is then moved to the new position, distorting te surface of the jelly. + */ + ShepardsDistortion, + + /** */ + ResizeDistortion, - static if ( MagickLibVersion >= 0x670 ) + /* Not a real distortion, ImageMagick uses this to get the amount of Distortions supported */ + SentinelDistortion + } + } + else + { + mixin( + { + string methods = "enum DistortImageMethod { - methods ~= "ResizeDistortion,"; - } + UndefinedDistortion, + AffineDistortion, + AffineProjectionDistortion, + ScaleRotateTranslateDistortion, + PerspectiveDistortion, + PerspectiveProjectionDistortion, + BilinearForwardDistortion, + BilinearDistortion = BilinearForwardDistortion, + BilinearReverseDistortion, + PolynomialDistortion, + ArcDistortion, + PolarDistortion, + DePolarDistortion,"; - methods ~= " - SentinelDistortion - }"; + static if ( MagickLibVersion >= 0x671 ) + { + methods ~= "Cylinder2PlaneDistortion, + Plane2CylinderDistortion,"; + } + + methods ~= " + BarrelDistortion, + BarrelInverseDistortion, + ShepardsDistortion,"; - return methods; - }()); + static if ( MagickLibVersion >= 0x670 ) + { + methods ~= "ResizeDistortion,"; + } + + methods ~= " + SentinelDistortion + }"; + + return methods; + }()); + } enum SparseColorMethod { |
