示例#1
0
        public static ColorConverter GetColorConverter(ColorManagement colorManagement, IImageParams source, IImageParams destination)
        {
            if (colorManagement != null)
            {
                var targetProfile = GetTargetProfile(colorManagement);
                if (!CompareProfiles(source.ColorProfile, destination.ColorProfile) || targetProfile != null && !CompareProfiles(targetProfile, destination.ColorProfile))
                {
                    return(new ColorConverter
                    {
                        ColorManagementEngine = ColorManagementEngine.LittleCms,
                        DestinationPixelFormat = destination.PixelFormat,
                        DestinationProfile = destination.ColorProfile,
                        DefaultSourceProfile = GetProfile(colorManagement, source.PixelFormat.ColorSpace),
                        TargetDeviceProfile = targetProfile
                    });
                }
                return(null);
            }

            if (source.PixelFormat != destination.PixelFormat &&
                (source.PixelFormat.ColorSpace != destination.PixelFormat.ColorSpace || source.PixelFormat.IsExtended != destination.PixelFormat.IsExtended ||
                 source.PixelFormat.IsIndexed != destination.PixelFormat.IsIndexed || (!source.PixelFormat.HasAlpha && destination.PixelFormat.HasAlpha)))
            {
                return(new ColorConverter
                {
                    ColorManagementEngine = ColorManagementEngine.None,
                    DestinationPixelFormat = destination.PixelFormat
                });
            }
            return(null);
        }
示例#2
0
        internal ResizeOptions(IImageSource source, Size size, string thumbnailId = null, ColorManagement colorManagement = null, bool isSquare = false, bool keepProportions = false)
        {
            _source = source;

            if (size.IsEmpty)
            {
                throw new ArgumentException(@"Size cannot be empty", "size");
            }

            if (size.Width < 0 || size.Height < 0)
            {
                throw new ArgumentOutOfRangeException("size");
            }

            var sourceParams = source.Params;

            if (sourceParams.FileFormat == FileFormat.Unknown)
            {
                throw new MediaUnsupportedException();
            }

            ColorManagement = colorManagement;

            Size = new Size(SMath.Min(size.Width, sourceParams.Width), SMath.Min(size.Height, sourceParams.Height));

            FileFormat = sourceParams.FileFormat == FileFormat.Jpeg ? FileFormat.Jpeg : _defaultFileFormat;

            PixelFormat = ColorManagement.GetPixelFormat(_defaultColorSpace, FileFormat != FileFormat.Jpeg);

            ResizeMode = isSquare ? Transforms.ResizeMode.ImageFill : keepProportions ? Transforms.ResizeMode.Shrink : Transforms.ResizeMode.Resize;

            ThumbnailId = GenerateThumbnailId(thumbnailId);
        }
示例#3
0
 public void Dispose()
 {
     if (ColorManagement != null)
     {
         ColorManagement.Dispose();
     }
 }
示例#4
0
        private Drawer GetFillShapeDrawer(IImageParams destImageParams, ColorManagement colorManagement, float scale)
        {
            var drawer = new Drawer();

            drawer.Draw += (sender, e) =>
            {
                if (!Utils.EqualsOfFloatNumbers(scale, 1))
                {
                    e.Graphics.Transform.Scale(scale, scale);
                }

                FillShape(e.Graphics, destImageParams, colorManagement);

                if (!IsStubContent)
                {
                    var clippingPath = GetClippingPath(e.Graphics.DpiX);

                    e.Graphics.ClippingPaths.Add(clippingPath);

                    Content.FillShape(e.Graphics, destImageParams, colorManagement);
                    Content.StrokeShape(e.Graphics, destImageParams, colorManagement);

                    e.Graphics.ClippingPaths.Remove(clippingPath);
                }

                if (!Utils.EqualsOfFloatNumbers(scale, 1))
                {
                    e.Graphics.Transform.Scale(1 / scale, 1 / scale);
                }
            };

            return(drawer);
        }
示例#5
0
        public void ExtendPipeline(Pipeline pipeline, IImageParams destImageParams, ColorManagement colorManagement, float scale, out IEnumerable <IDisposable> deps)
        {
            deps = new List <IDisposable>();

            if (CanExtendPipeline)
            {
                pipeline.Add(GetFillShapeDrawer(destImageParams, colorManagement, scale));

                var dpi   = destImageParams.DpiX * scale;
                var alpha = new Transforms.ScaleAlpha(GetAlphaChannel(dpi, deps))
                {
                    Scale = Opacity
                };

                var combiner = ((ImageVObject)Content).GetImageCombiner(destImageParams, colorManagement, scale, deps, alpha);
                if (combiner != null)
                {
                    pipeline.Add(combiner);
                }

                pipeline.Add(GetStrokeShapeDrawer(destImageParams, colorManagement, scale));
            }
            else
            {
                pipeline.Add(GetDrawer(destImageParams, colorManagement));
            }
        }
示例#6
0
        public void Convert(ColorConverter converter, ColorSpace colorSpace)
        {
            var colors = GetColors(colorSpace);
            var bitmap = GetBitmap(colorSpace);

            if (bitmap != null)
            {
                bitmap.Dispose();
            }

            bitmap = new Bitmap();

            if (colors.Length <= 0)
            {
                return;
            }

            using (var source = new Bitmap(colors.Length, 1, ColorManagement.GetPixelFormat(colorSpace)))
            {
                for (var i = 0; i < colors.Length; i++)
                {
                    source.SetPixel(i, 0, colors[i]);
                }

                Pipeline.Run(source + converter + bitmap);
            }

            SetBitmap(bitmap, colorSpace);
        }
示例#7
0
        internal void WriteThumbnail(Stream stream, IResizeOptions options)
        {
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }

            if (options == null)
            {
                throw new ArgumentNullException("options");
            }

            Pipeline pipeline = null;

            try
            {
                using (var readStream = options.GetSourceImageReadStream())
                    using (var reader = ImageReader.Create(readStream))
                    {
                        IImageParams firstElement;
                        var          psdReader = reader as PsdReader;
                        if (psdReader != null)
                        {
                            if (psdReader.MergedImageFrame == null)
                            {
                                throw new MediaUnsupportedException("Cannot read merged image frame from from PSD.");
                            }

                            firstElement = psdReader.MergedImageFrame;
                        }
                        else
                        {
                            firstElement = reader;
                        }

                        pipeline = new Pipeline((PipelineElement)firstElement);

                        if (firstElement.Width != options.Size.Width || firstElement.Height != options.Size.Height)
                        {
                            pipeline.Add(new Resize(options.Size, ResizeInterpolationMode.Anisotropic9, options.ResizeMode));
                        }

                        var cc = ColorManagement.GetColorConverter(options.ColorManagement, firstElement, options.PixelFormat, true);
                        if (cc != null)
                        {
                            pipeline.Add(cc);
                        }

                        pipeline.Add(ImageWriter.Create(stream, Common.GetWriterSettings(options.FileFormat)));
                        pipeline.Run();
                    }
            }
            finally
            {
                if (pipeline != null)
                {
                    pipeline.DisposeAllElements();
                }
            }
        }
示例#8
0
        internal Combiner GetImageCombiner(IImageParams destImageParams, ColorManagement colorManagement, float scale, IEnumerable <IDisposable> deps)
        {
            var pipeline = GetSvgPipeline(destImageParams, colorManagement, scale);

            pipeline.Add(new ScaleAlpha(Opacity));

            if (!Angle.Equals(0))
            {
                var rotate = new MatrixTransform
                {
                    Matrix            = Matrix.CreateRotate((float)Angle),
                    InterpolationMode = InterpolationMode.High,
                    BackgroundColor   = ColorManagement.GetTransparentColor(destImageParams.PixelFormat)
                };

                pipeline.Add(rotate);
            }

            var imageLocation = GetDrawingRectangle(destImageParams.DpiX * scale).Bounds.Location;
            var imageCombiner = new Combiner(CombineMode.AlphaOverlay, pipeline, true)
            {
                X = (int)imageLocation.X,
                Y = (int)imageLocation.Y
            };

            return(imageCombiner);
        }
示例#9
0
        private static VObject CreateShapeVObject(PsdShapeFrame frame)
        {
            if (frame.Width == 0 || frame.Height == 0)
            {
                return(null);
            }

            var brush = frame.Brush as SolidBrush;
            var path  = frame.VectorMask != null?Path.FromAdvancedPath(frame.VectorMask) : null;

            if (path != null)
            {
                path.Scale(72 / frame.DpiX, 72 / frame.DpiY);
            }

            var shapeVObject = new ShapeVObject
            {
                Path        = path,
                Opacity     = frame.Opacity,
                BorderColor = frame.Pen != null ? frame.Pen.Color : ColorManagement.GetBlackColor(frame.ColorSpace),
                BorderWidth = frame.Pen != null ? frame.Pen.Width : 0,
                FillColor   = brush != null ? brush.Color : ColorManagement.GetTransparentColor(frame.ColorSpace)
            };

            return(shapeVObject);
        }
示例#10
0
        public void ExtendPipeline(Pipeline pipeline, IImageParams destImageParams, ColorManagement colorManagement, float scale, out IEnumerable <IDisposable> deps)
        {
            deps = new List <IDisposable>();

            pipeline.Add(GetShapeDrawer(destImageParams, colorManagement, scale));
            pipeline.Add(GetImageCombiner(destImageParams, colorManagement, scale, deps));
        }
示例#11
0
        internal override void Draw(Graphics graphics, IImageParams destImageParams, ColorManagement colorManagement)
        {
            var bounds = Bounds;

            if (bounds.Width <= 0 || bounds.Height <= 0)
            {
                return;
            }

            base.Draw(graphics, destImageParams, colorManagement);

            var dpi    = graphics.DpiX;
            var angle  = (float)Angle;
            var center = GetDrawingRectangle(dpi).Center.ToPointF();

            var points = new[] { center };

            graphics.Transform.TransformPoints(points);
            center = points[0];

            graphics.Transform.RotateAt(angle, center, System.Drawing.Drawing2D.MatrixOrder.Append);

            var pipeline = GetSvgPipeline(destImageParams, colorManagement);

            pipeline.Add(new ScaleAlpha(Opacity));
            var location = GetImageRectangle(dpi).Location;

            graphics.DrawImage(pipeline, location.X, location.Y);
            pipeline.DisposeAllElements();

            graphics.Transform.RotateAt(-angle, center, System.Drawing.Drawing2D.MatrixOrder.Append);
        }
示例#12
0
        private void UpdateStrokeColor(SvgLib.SvgElement el, ColorManagement colorManagement)
        {
            if (el is SvgLib.SvgCircle || el is SvgLib.SvgEllipse || el is SvgLib.SvgLine || el is SvgLib.SvgPath || el is SvgLib.SvgPolygon || el is SvgLib.SvgPolyline || el is SvgLib.SvgRectangle)
            {
                var stroke = (el as SvgLib.SvgVisualElement).Stroke;
                if (stroke != null)
                {
                    System.Drawing.Color color;
                    if (StrokeColor is RgbColor)
                    {
                        color = StrokeColor.ToGdiPlusColor();
                    }
                    else
                    {
                        colorManagement = colorManagement ?? GetColorManagement(true);
                        color           = ColorManagement.GetPreviewColor(colorManagement, _strokeColor);
                    }

                    (stroke as SvgLib.SvgColourServer).Colour = color;
                }
            }

            if (el.HasChildren())
            {
                foreach (var ch in el.Children)
                {
                    UpdateStrokeColor(ch, colorManagement);
                }
            }
        }
示例#13
0
 private void UpdateStrokeColor(ColorManagement colorManagement = null)
 {
     if (_svgDoc != null)
     {
         UpdateStrokeColor(_svgDoc, colorManagement);
     }
 }
示例#14
0
        protected internal override void DrawContent(Graphics graphics, IImageParams destImageParams, ColorManagement colorManagement)
        {
            if (!Configuration.FileCache.FileExists(SourceFileId))
            {
                return;
            }

            using (var stream = Configuration.FileCache.GetReadStream(SourceFileId, true))
                using (var reader = ImageReader.Create(stream))
                {
                    IImageParams firstElement;
                    var          psdReader = reader as PsdReader;
                    if (psdReader != null)
                    {
                        firstElement = psdReader.MergedImageFrame;
                    }
                    else
                    {
                        firstElement = reader;
                    }

                    var pipeline = new Pipeline((PipelineElement)firstElement);

                    if (!Utils.EqualsOfFloatNumbers(graphics.DpiX, firstElement.DpiX) ||
                        !Utils.EqualsOfFloatNumbers(graphics.DpiY, firstElement.DpiY))
                    {
                        pipeline.Add(new ResolutionModifier(graphics.DpiX, graphics.DpiY));
                    }

                    var imageRect = GetImageRectangle(graphics.DpiX);
                    if (firstElement.Width != imageRect.Width || firstElement.Height != imageRect.Height)
                    {
                        pipeline.Add(new Resize(imageRect.Width, imageRect.Height, _resizeInterpolationMode));
                    }

                    var colorConverter = ColorManagement.GetColorConverter(colorManagement, firstElement, destImageParams);
                    if (colorConverter != null)
                    {
                        pipeline.Add(colorConverter);
                    }

                    pipeline.Add(new ScaleAlpha(Opacity));

                    var dpi    = graphics.DpiX;
                    var angle  = (float)Angle;
                    var center = GetDrawingRectangle(dpi).Center.ToPointF();

                    var points = new[] { center };
                    graphics.Transform.TransformPoints(points);
                    center = points[0];

                    graphics.Transform.RotateAt(angle, center, MatrixOrder.Append);

                    var location = imageRect.Location;
                    graphics.DrawImage(pipeline, location.X, location.Y, Opacity);

                    graphics.Transform.RotateAt(-angle, center, MatrixOrder.Append);
                }
        }
示例#15
0
        public static ColorProfile GetTargetProfile(ColorManagement colorManagement)
        {
            if (colorManagement == null || !colorManagement.TargetColorSpace.HasValue)
            {
                return(null);
            }

            return(GetProfile(colorManagement, colorManagement.TargetColorSpace.Value));
        }
示例#16
0
        internal static Color GetColorFromColorMap(ColorManagement colorManagement, Color color, IImageParams destination)
        {
            if (colorManagement == null || !colorManagement.HasColorMap(destination))
            {
                return(null);
            }

            return(colorManagement._colorMap.GetColor(color));
        }
示例#17
0
        private string GenerateThumbnailId(string thumbnailId = null)
        {
            var ext = Common.GetImageExtension(FileFormat);

            if (ext == null)
            {
                throw new MediaUnsupportedException(string.Format("FileFormat: {0}", FileFormat));
            }

            string id;

            if (!string.IsNullOrEmpty(thumbnailId))
            {
                id = thumbnailId;
            }
            else
            {
                var fileName = new StringBuilder(Path.GetFileNameWithoutExtension(_source.Name));
                var ci       = CultureInfo.InvariantCulture;
                fileName.Append("[");
                fileName.Append(Size.Width.ToString(ci));
                fileName.Append("x");
                fileName.Append(Size.Height.ToString(ci));

                if (ColorManagement != null)
                {
                    fileName.Append(",cm(");
                    var sourceProfile = ColorManagement.GetProfile(ColorManagement, _source.Params.PixelFormat.ColorSpace);
                    if (sourceProfile != null)
                    {
                        fileName.Append(AjaxControls.Common.CalculateMD5(Encoding.UTF8.GetBytes(sourceProfile.Description)));
                    }

                    var targetProfile = ColorManagement.GetTargetProfile(ColorManagement);
                    if (targetProfile != null)
                    {
                        fileName.Append(",");
                        fileName.Append(AjaxControls.Common.CalculateMD5(Encoding.UTF8.GetBytes(targetProfile.Description)));
                    }

                    fileName.Append(")");
                }

                if (ResizeMode != Transforms.ResizeMode.Resize)
                {
                    fileName.Append(",");
                    fileName.Append(ResizeMode);
                }

                fileName.Append("]");

                id = fileName.ToString().ToLowerInvariant();
            }

            return(string.Format("{0}.{1}", id, ext));
        }
示例#18
0
        public virtual PipelineElement GetDrawer(IImageParams destImageParams, ColorManagement colorManagement)
        {
            var drawer = new Drawer();

            drawer.Draw += (sender, e) =>
            {
                Draw(e.Graphics, destImageParams, colorManagement);
            };

            return(drawer);
        }
示例#19
0
        private ResizeOptions ParseResizeOptions(HttpContextBase context)
        {
            var request = context.Request;
            var fileId  = request["f"];

            if (request.Params.Count == 0 || string.IsNullOrEmpty(fileId) || !_fileCache.FileExists(fileId))
            {
                throw new InvalidOperationException();
            }

            int width;

            if (!int.TryParse(request["w"], out width))
            {
                width = 0;
            }

            int height;

            if (!int.TryParse(request["h"], out height))
            {
                height = 0;
            }

            ColorManagement cm                 = null;
            var             cmykProfileId      = request["cmyk"];
            var             rgbProfileId       = request["rgb"];
            var             grayscaleProfileId = request["grayscale"];

            if (!string.IsNullOrEmpty(cmykProfileId) && !string.IsNullOrEmpty(rgbProfileId) && !string.IsNullOrEmpty(grayscaleProfileId))
            {
                cm = new ColorManagement
                {
                    CmykColorProfileFileId      = cmykProfileId,
                    RgbColorProfileFileId       = rgbProfileId,
                    GrayscaleColorProfileFileId = grayscaleProfileId
                };

                ColorSpace colorSpace;
                if (Common.TryParseEnum(request["target"], out colorSpace) && colorSpace != ColorSpace.Unknown)
                {
                    cm.TargetColorSpace = colorSpace;
                }
            }

            bool squared;

            if (!bool.TryParse(request["sq"], out squared))
            {
                squared = false;
            }

            return(new ResizeOptions(fileId, new Size(width, height), cm, squared));
        }
示例#20
0
        internal void DrawText(Graphics graphics, IImageParams destImageParams, ColorManagement colorManagement)
        {
            var text = CreateText(graphics);

            var color = ColorManagement.ConvertColor(colorManagement, TextColor, destImageParams);

            color      = color.ScaleAlpha(Opacity);
            text.Brush = new SolidBrush(color);

            RotateText(text, graphics.DpiX);

            graphics.DrawText(text);
        }
示例#21
0
        internal override void Draw(Graphics graphics, IImageParams destImageParams, ColorManagement colorManagement)
        {
            var bounds = Bounds;

            if (bounds.Width <= 0 || bounds.Height <= 0)
            {
                return;
            }

            base.Draw(graphics, destImageParams, colorManagement);

            DrawContent(graphics, destImageParams, colorManagement);
        }
示例#22
0
        public void ExtendPipeline(Pipeline pipeline, IImageParams destImageParams, ColorManagement colorManagement, float scale, out IEnumerable <IDisposable> deps)
        {
            deps = new List <IDisposable>();

            pipeline.Add(GetShapeDrawer(destImageParams, colorManagement, scale));

            var scaleAlpha = new ScaleAlpha(Opacity);
            var combiner   = GetImageCombiner(destImageParams, colorManagement, scale, deps, scaleAlpha);

            if (combiner != null)
            {
                pipeline.Add(combiner);
            }
        }
示例#23
0
        public virtual void Draw(Bitmap bitmap)
        {
            var vObject = this as IPipelineExtender;

            if (vObject != null && vObject.CanExtendPipeline)
            {
                var addAlpha = false;
                if (!bitmap.PixelFormat.HasAlpha)
                {
                    bitmap.Channels.SetAlpha(1);
                    addAlpha = true;
                }

                IEnumerable <IDisposable> deps;
                var pipeline = new Pipeline(bitmap);
                var scale    = bitmap.DpiX / TargetDpi ?? 1;
                vObject.ExtendPipeline(pipeline, bitmap, GetColorManagement(), scale, out deps);

                using (var newBitmap = new Bitmap())
                {
                    pipeline.Add(newBitmap);
                    pipeline.Run();
                    pipeline.Remove(bitmap);

                    Pipeline.Run(newBitmap + bitmap);
                }

                if (addAlpha)
                {
                    bitmap.Channels.RemoveAlpha(ColorManagement.GetTransparentColor(bitmap.PixelFormat));
                }

                pipeline.DisposeAllElements();

                if (deps != null)
                {
                    foreach (var dep in deps)
                    {
                        dep.Dispose();
                    }
                }
            }
            else
            {
                using (var graphics = bitmap.GetAdvancedGraphics())
                {
                    Draw(graphics, bitmap, GetColorManagement());
                }
            }
        }
示例#24
0
        public static Color ConvertColor(ColorManagement colorManagement, Color color, IImageParams destination)
        {
            var result = GetColorFromColorMap(colorManagement, color, destination);

            if (result != null)
            {
                return(result);
            }

            var source         = new ImageParams(color.PixelFormat, GetProfile(colorManagement, color.ColorSpace));
            var colorConverter = GetColorConverter(colorManagement, source, destination);

            return(colorConverter != null?colorConverter.ConvertColor(color, source.ColorProfile) : color);
        }
示例#25
0
        public Bitmap RenderLayers(
            IEnumerable <Layer> layers,
            SizeF workspace,
            float dpi                       = 300f,
            ColorSpace colorSpace           = ColorSpace.Rgb,
            Color backgroundColor           = null,
            bool isPreview                  = false,
            ColorManagement colorManagement = null,
            float?targetDpi                 = null)
        {
            var bitmap = new Bitmap();

            RenderLayers(bitmap, layers, workspace, dpi, colorSpace, backgroundColor, isPreview, workspace, colorManagement, targetDpi);
            return(bitmap);
        }
示例#26
0
        internal string GetMD5(float dpi)
        {
            var bytes = GetBytes();

            bytes.AddRange(BitConverter.GetBytes(dpi));

            var color = ColorManagement.GetPreviewColor(GetColorManagement(true), TextColor);

            bytes.AddRange(BitConverter.GetBytes(color.ToInt32()));

            if (TargetDpi.HasValue)
            {
                bytes.AddRange(BitConverter.GetBytes(TargetDpi.Value));
            }

            return(AjaxControls.Common.CalculateMD5(bytes.ToArray()));
        }
示例#27
0
        public JsonVOSerializer(ColorManagement colorManagement = null)
        {
            _colorConverter.ColorManagement = colorManagement;

            _serializer = new JsonSerializer
            {
                Converters =
                {
                    _colorConverter,
                    new PointFConverter(),
                    new RotatedRectangleFConverter(),
                    new RectangleFConverter(),
                    new VObjectDataConverter(),
                    new PlaceholderVObjectDataConverter()
                },
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore
            };
        }
示例#28
0
        internal override void Draw(Graphics graphics, IImageParams destImageParams, ColorManagement colorManagement)
        {
            var bounds = Bounds;

            if (bounds.Width <= 0 || bounds.Height <= 0)
            {
                return;
            }

            var dpi   = graphics.DpiX;
            var width = Width;

            if (width > 0)
            {
                var color = ColorManagement.ConvertColor(colorManagement, Color, destImageParams);
                color = color.ScaleAlpha(Opacity);
                graphics.DrawPath(new Pen(color, width), GetDrawingPath(dpi));
            }
        }
示例#29
0
        internal override void Draw(Graphics graphics, IImageParams destImageParams, ColorManagement colorManagement)
        {
            var bounds = Bounds;

            if (bounds.Width <= 0 || bounds.Height <= 0)
            {
                return;
            }

            var dpi = graphics.DpiX;

            var width = GetWidth(dpi * graphics.Transform.Elements[0]);

            if (width > 0)
            {
                var paths = GetPaths();
                if (!Utils.EqualsOfFloatNumbers(dpi, 72))
                {
                    using (var matrix = new Matrix())
                    {
                        matrix.Scale(dpi / 72, dpi / 72, MatrixOrder.Append);
                        paths[0].ApplyTransform(matrix);
                        paths[1].ApplyTransform(matrix);
                    }
                }

                if (!Color.IsTransparent)
                {
                    var color = ColorManagement.ConvertColor(colorManagement, Color, destImageParams);
                    color = color.ScaleAlpha(Opacity);
                    graphics.DrawPath(new Pen(color, width), paths[0]);
                }

                if (!AltColor.IsTransparent)
                {
                    var altColor = ColorManagement.ConvertColor(colorManagement, AltColor, destImageParams);
                    altColor = altColor.ScaleAlpha(Opacity);
                    graphics.DrawPath(new Pen(altColor, width), paths[1]);
                }
            }
        }
示例#30
0
        private Drawer GetStrokeShapeDrawer(IImageParams destImageParams, ColorManagement colorManagement, float scale)
        {
            var drawer = new Drawer();

            drawer.Draw += (sender, e) =>
            {
                if (!Utils.EqualsOfFloatNumbers(scale, 1))
                {
                    e.Graphics.Transform.Scale(scale, scale);
                }

                StrokeShape(e.Graphics, destImageParams, colorManagement);

                if (!Utils.EqualsOfFloatNumbers(scale, 1))
                {
                    e.Graphics.Transform.Scale(1 / scale, 1 / scale);
                }
            };

            return(drawer);
        }