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(); } } }
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); } }
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); }
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); }