sig
  external initialize : unit -> unit = "caml_InitializeMagick"
  external destroy : unit -> unit = "caml_DestroyMagick"
  type image
  type images
  external read_image : filename:string -> Magick.image = "caml_ReadImage"
  external write_image : Magick.image -> filename:string -> unit
    = "caml_WriteImage"
  external blob_to_image : blob:string -> Magick.image = "caml_BlobToImage"
  external get_canvas :
    width:int -> height:int -> color:string -> Magick.image
    = "caml_CanvasImage"
  external clone : Magick.image -> Magick.image = "caml_CloneImage"
  external image_width : Magick.image -> int = "caml_ImageWidth"
  external image_height : Magick.image -> int = "caml_ImageHeight"
  external display : Magick.image -> unit = "caml_DisplayImages"
  external destroy_image : Magick.image -> unit = "caml_DestroyImage"
  val blur :
    Magick.image -> ?radius:float -> sigma:float -> unit -> Magick.image
  external motion_blur :
    Magick.image ->
    radius:float -> sigma:float -> angle:float -> Magick.image
    = "caml_MotionBlurImage"
  external emboss :
    Magick.image -> radius:float -> sigma:float -> Magick.image
    = "caml_EmbossImage"
  external sharpen :
    Magick.image -> radius:float -> sigma:float -> Magick.image
    = "caml_SharpenImage"
  external edge : Magick.image -> radius:float -> Magick.image
    = "caml_EdgeImage"
  external enhance : Magick.image -> Magick.image = "caml_EnhanceImage"
  external shade :
    Magick.image ->
    gray:int -> azimuth:float -> elevation:float -> Magick.image
    = "caml_ShadeImage"
  external charcoal :
    Magick.image -> radius:float -> sigma:float -> Magick.image
    = "caml_CharcoalImage"
  external implode : Magick.image -> amount:float -> Magick.image
    = "caml_ImplodeImage"
  external morph : Magick.images -> frames:int -> Magick.images
    = "caml_MorphImages"
  external oil_paint : Magick.image -> radius:float -> Magick.image
    = "caml_OilPaintImage"
  external swirl : Magick.image -> degrees:float -> Magick.image
    = "caml_SwirlImage"
  external wave :
    Magick.image -> amplitude:float -> length:float -> Magick.image
    = "caml_WaveImage"
  external contrast : Magick.image -> sharpen:int -> unit
    = "caml_ContrastImage"
  external equalize : Magick.image -> unit = "caml_EqualizeImage"
  external gamma : Magick.image -> level:string -> unit = "caml_GammaImage"
  external level : Magick.image -> level:string -> unit = "caml_LevelImage"
  module Channel :
    sig
      type channel_type =
          Undefined
        | Red
        | Cyan
        | Green
        | Magenta
        | Blue
        | Yellow
        | Opacity
        | Black
        | Matte
        | All
        | Gray
    end
  external level_channel :
    Magick.image ->
    channel:Magick.Channel.channel_type ->
    black_point:float -> mid_point:float -> white_point:float -> unit
    = "caml_LevelImageChannel"
  external modulate : Magick.image -> string -> unit = "caml_ModulateImage"
  external negate : Magick.image -> int -> unit = "caml_NegateImage"
  external normalize : Magick.image -> unit = "caml_NormalizeImage"
  external flip : Magick.image -> Magick.image = "caml_FlipImage"
  external flop : Magick.image -> Magick.image = "caml_FlopImage"
  type rectangle_info = { x : int; y : int; width : int; height : int; }
  external crop : Magick.image -> Magick.rectangle_info -> Magick.image
    = "caml_CropImage"
  val shave : Magick.image -> int * int -> Magick.image
  external roll :
    Magick.image -> x_offset:int -> y_offset:int -> Magick.image
    = "caml_RollImage"
  external sample : Magick.image -> width:int -> height:int -> Magick.image
    = "caml_SampleImage"
  external scale : Magick.image -> width:int -> height:int -> Magick.image
    = "caml_ScaleImage"
  external thumbnail :
    Magick.image -> width:int -> height:int -> Magick.image
    = "caml_ThumbnailImage"
  external magnify : Magick.image -> Magick.image = "caml_MagnifyImage"
  external minify : Magick.image -> Magick.image = "caml_MinifyImage"
  module Filter :
    sig
      type filter_type =
          Undefined
        | DefaultResize
        | Point
        | Box
        | Triangle
        | Hermite
        | Hanning
        | Hamming
        | Blackman
        | Gaussian
        | Quadratic
        | Cubic
        | Catrom
        | Mitchell
        | Lanczos
        | Bessel
        | Sinc
    end
  val resize :
    Magick.image ->
    width:int ->
    height:int ->
    ?filter:Magick.Filter.filter_type -> ?blur:float -> unit -> Magick.image
  module CompositeOp :
    sig
      type composite_operator =
          Undefined
        | Over
        | In
        | Out
        | Atop
        | Xor
        | Plus
        | Minus
        | Add
        | Subtract
        | Difference
        | Multiply
        | Bumpmap
        | Copy
        | CopyRed
        | CopyGreen
        | CopyBlue
        | CopyOpacity
        | Clear
        | Dissolve
        | Displace
        | Modulate
        | Threshold
        | No
        | Darken
        | Lighten
        | Hue
        | Saturate
        | Colorize
        | Luminize
        | Screen
        | Overlay
        | CopyCyan
        | CopyMagenta
        | CopyYellow
        | CopyBlack
        | Divide
        | HardLight
        | Exclusion
        | ColorDodge
        | ColorBurn
        | SoftLight
        | LinearBurn
        | LinearDodge
        | LinearLight
        | VividLight
        | PinLight
        | HardMix
      val to_string : Magick.CompositeOp.composite_operator -> string
      val of_string : string -> Magick.CompositeOp.composite_operator
    end
  val composite :
    Magick.image ->
    compose:Magick.CompositeOp.composite_operator ->
    Magick.image -> ?x_offset:int -> ?y_offset:int -> unit -> unit
  module ImgList :
    sig
      type img_list = Magick.images
      external new_image_list : unit -> Magick.ImgList.img_list
        = "caml_NewImageList"
      external destroy_image_list : Magick.ImgList.img_list -> unit
        = "caml_DestroyImageList"
      external append_image :
        Magick.ImgList.img_list -> Magick.image -> Magick.ImgList.img_list
        = "caml_AppendImageToList"
      external prepend_image :
        Magick.ImgList.img_list -> Magick.image -> Magick.ImgList.img_list
        = "caml_PrependImageToList"
      external get_first_image : Magick.ImgList.img_list -> Magick.image
        = "caml_GetFirstImageInList"
      external get_image :
        Magick.ImgList.img_list -> offset:int -> Magick.image
        = "caml_GetImageFromList"
      external length : Magick.ImgList.img_list -> int
        = "caml_GetImageListLength"
      external get_index : Magick.ImgList.img_list -> int
        = "caml_GetImageIndexInList"
    end
  module Draw :
    sig
      type context
      external allocate_context : Magick.image -> Magick.Draw.context
        = "caml_DrawAllocateContext"
      external destroy_context : Magick.Draw.context -> unit
        = "caml_DrawDestroyContext"
      external stroke_color_string : Magick.Draw.context -> string -> unit
        = "caml_DrawSetStrokeColorString"
      external fill_color_string : Magick.Draw.context -> string -> unit
        = "caml_DrawSetFillColorString"
      external stroke_width : Magick.Draw.context -> float -> unit
        = "caml_DrawSetStrokeWidth"
      external circle :
        Magick.Draw.context ->
        ox:float -> oy:float -> px:float -> py:float -> unit
        = "caml_DrawCircle"
      external line :
        Magick.Draw.context ->
        x1:float -> y1:float -> x2:float -> y2:float -> unit
        = "caml_DrawLine"
      external rectangle :
        Magick.Draw.context ->
        x1:float -> y1:float -> x2:float -> y2:float -> unit
        = "caml_DrawRectangle"
      external round_rectangle :
        Magick.Draw.context ->
        p1:float * float -> p2:float * float -> r:float * float -> unit
        = "caml_DrawRoundRectangle"
      external arc :
        Magick.Draw.context ->
        p1:float * float -> p2:float * float -> rot:float * float -> unit
        = "caml_DrawArc"
      external ellipse :
        Magick.Draw.context ->
        o:float * float -> r:float * float -> rot:float * float -> unit
        = "caml_DrawEllipse"
      external bezier :
        Magick.Draw.context -> coords:(float * float) array -> unit
        = "caml_DrawBezier"
      external render : Magick.Draw.context -> unit = "caml_DrawRender"
    end
  external describe : Magick.image -> unit = "caml_DescribeImage"
  external set_image_attribute :
    Magick.image -> key:string -> value:string -> unit
    = "caml_SetImageAttribute"
  external get_image_attribute : Magick.image -> key:string -> string
    = "caml_GetImageAttribute"
end