 image objects, or from raw image data you receive.
open class Image: View, NSCopying {
    open class ImageView: UIImageView {
        var imageLayer: ImageLayer {
            return self.layer as! ImageLayer // swiftlint:disable:this force_cast
        }

        override open class var layerClass: AnyClass {
            return ImageLayer.self
        }
    }

    /// Shape's contents are drawn on a ShapeLayer.
    open var imageLayer: ImageLayer {
        return self.imageView.imageLayer
    }

    // MARK: Initializers

    /// Initializes an empty Image
    public override init() {
        super.init()
        let uiimage = UIImage()
        self.view = ImageView(image: uiimage)
    }

    public override init(frame: Rect) {
        super.init(frame: frame)
        let uiimage = UIImage()
        let imageView = ImageView(image: uiimage)
        imageView.frame = self.view.bounds
        self.view = imageView
    }

    /// Initializes a new Image using the specified filename from the bundle (i.e. your project), it will also grab images
    /// from the web if the filename starts with http.
    /// ````
    /// let img = Image("logo")
    /// canvas.add(img)
    /// ````
    /// - parameter name:	The name of the image included in your project, or a web address.
    convenience public init?(_ name: String) {
        self.init(name, scale: 1.0)
    }

    /// Initializes a new Image using the specified filename from the bundle (i.e. your project), it will also grab images
    /// from the web if the filename starts with http.
    /// ````
    /// let img = Image("http://www.c4ios.com/images/logo@2x.png", scale: 2.0)
    /// canvas.add(img)
    /// ````
    /// - parameter name:	The name of the image included in your project, or a web address.
    convenience public init?(_ name: String, scale: Double) {
        guard let image = UIImage(named: name) else {
            return nil
        }
        self.init(uiimage: image, scale: scale)
    }

    /// Initializes a new Image using an existing Image (basically l