Пример #1
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);
        }
Пример #2
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);
        }
Пример #3
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());
                }
            }
        }
Пример #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);
        }