Пример #1
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();
                }
            }
        }
Пример #2
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);
                }
        }
Пример #3
0
        private Pipeline GetSvgPipeline(IImageParams destImageParams, ColorManagement colorManagement, float scale = 1)
        {
            var dpi  = destImageParams.DpiX * scale;
            var rect = GetImageRectangle(dpi);

            var svg = (SvgLib.SvgDocument)_svgDoc.Clone();

            if (((RectangleF)svg.ViewBox).IsEmpty)
            {
                svg.Transforms.Add(new SvgLib.Transforms.SvgScale(rect.Width / svg.Width, rect.Height / svg.Height));
            }

            svg.Width  = rect.Width;
            svg.Height = rect.Height;
            svg.Ppi    = (int)dpi;

            UpdateStrokeColor(svg, colorManagement);

            var bitmap = new Bitmap(svg.Draw());

            bitmap.DpiX = dpi;
            bitmap.DpiY = dpi;

            svg.Transforms.Clear();

            var pipeline = new Pipeline(bitmap);

            var colorConverter = ColorManagement.GetColorConverter(colorManagement, bitmap, destImageParams);

            if (colorConverter != null)
            {
                pipeline.Add(colorConverter);
            }

            return(pipeline);
        }
Пример #4
0
        internal Combiner GetImageCombiner(IImageParams destImageParams, ColorManagement colorManagement, float scale, IEnumerable <IDisposable> deps, ScaleAlpha alpha)
        {
            if (!Configuration.FileCache.FileExists(SourceFileId))
            {
                return(null);
            }

            var imageStream = Configuration.FileCache.GetReadStream(SourceFileId, true);

            ((IList)deps).Add(imageStream);

            var reader = ImageReader.Create(imageStream);

            ((IList)deps).Add(reader);

            IImageParams firstElement;
            var          psdReader = reader as PsdReader;

            if (psdReader != null)
            {
                firstElement = psdReader.MergedImageFrame;
            }
            else
            {
                firstElement = reader;
            }

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

            var dpi       = destImageParams.DpiX * scale;
            var imageRect = GetImageRectangle(dpi);

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

            if (alpha != null)
            {
                pipeline.Add(alpha);
            }

            // Convert color of image
            var colorConverter = ColorManagement.GetColorConverter(colorManagement, firstElement, destImageParams);

            if (colorConverter != null)
            {
                pipeline.Add(colorConverter);
            }

            if (!Angle.Equals(0))
            {
                // Don't rotate bitmap without alpha channel.
                if (!firstElement.PixelFormat.HasAlpha)
                {
                    // Add alpha channel if scaleAlpha or color conversion does not add it
                    if (alpha == null && (colorConverter == null || !colorConverter.DestinationPixelFormat.HasAlpha))
                    {
                        pipeline.Add(new SetAlpha(1));
                    }
                }

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

                pipeline.Add(rotate);
            }

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

            return(imageCombiner);
        }