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); }
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); }
public void Dispose() { if (ColorManagement != null) { ColorManagement.Dispose(); } }
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); }
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)); } }
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); }
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(); } } }
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); }
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); }
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)); }
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); }
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); } } }
private void UpdateStrokeColor(ColorManagement colorManagement = null) { if (_svgDoc != null) { UpdateStrokeColor(_svgDoc, colorManagement); } }
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); } }
public static ColorProfile GetTargetProfile(ColorManagement colorManagement) { if (colorManagement == null || !colorManagement.TargetColorSpace.HasValue) { return(null); } return(GetProfile(colorManagement, colorManagement.TargetColorSpace.Value)); }
internal static Color GetColorFromColorMap(ColorManagement colorManagement, Color color, IImageParams destination) { if (colorManagement == null || !colorManagement.HasColorMap(destination)) { return(null); } return(colorManagement._colorMap.GetColor(color)); }
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)); }
public virtual PipelineElement GetDrawer(IImageParams destImageParams, ColorManagement colorManagement) { var drawer = new Drawer(); drawer.Draw += (sender, e) => { Draw(e.Graphics, destImageParams, colorManagement); }; return(drawer); }
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)); }
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); }
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); }
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); } }
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()); } } }
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); }
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); }
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())); }
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 }; }
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)); } }
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]); } } }
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); }