private void ProcessExpression(string expr, DirectoryInfo root) { if (expr.StartsWith("comp:", StringComparison.OrdinalIgnoreCase)) { expr = expr.Substring(5); } var layers = expr.Split(';'); if (layers.Length < 2) { throw new ArgumentException( "compositionExpression was not formatted correctly or contains no images", nameof(expr) ); } /////////////////////////////////// // Options var options = layers[0]; var opts = options.Split(','); if (opts.Length < 2) { throw new ArgumentException( "compositionExpression was not formatted correctly: too few options", nameof(expr) ); } var dxStr = opts[0]; var dyStr = opts[1]; if (!int.TryParse(dxStr, NumberStyles.Integer, CultureInfo.InvariantCulture, out var dx)) { throw new ArgumentException("Image X size must be an integer", nameof(expr)); } if (!int.TryParse(dyStr, NumberStyles.Integer, CultureInfo.InvariantCulture, out var dy)) { throw new ArgumentException("Image Y size must be an integer", nameof(expr)); } Dimensions = new Size(dx, dy); if (opts.Length >= 3) { var bpp = opts[2]; if (!bpp.StartsWith("Format", StringComparison.OrdinalIgnoreCase)) { bpp = "Format" + bpp; } #if QUANTIZE try { PixelFormat = (PixelFormat)Enum.Parse(typeof(PixelFormat), bpp, true); } catch (ArgumentException) { } #endif } /////////////////////////////////// // Layers for (var i = 1; i < layers.Length; i++) { var layerExpr = layers[i]; var l = new CompositedLayer(layerExpr, root); Layers.Add(l); } }
public Bitmap ToBitmap() { if (Dimensions.IsEmpty) { throw new InvalidOperationException("The specified image dimensions is invalid"); } ///////////////////////// // Make the composited bitmap #if QUANTIZE Bitmap bmp = new Bitmap(Dimensions.Width, Dimensions.Height); #else Bitmap bmp = new Bitmap(Dimensions.Width, Dimensions.Height, PixelFormat.Format24bppRgb); #endif using (Graphics g = Graphics.FromImage(bmp)) { for (int i = 0; i < _layers.Count; i++) { CompositedLayer l = _layers[i]; Rectangle rect; if (i == 0) { // use the color of the bottom-left pixel of the background layer as the background color Bitmap lbmp = l.Image as Bitmap; if (lbmp != null && lbmp.Height < bmp.Height) { Color blp = lbmp.GetPixel(0, lbmp.Height - 1); g.FillRectangle(new SolidBrush(blp), 0, 0, lbmp.Width, lbmp.Height); } } if (l.Dimensions.IsEmpty) { rect = new Rectangle(l.Location, l.Image.Size); } else { rect = new Rectangle(l.Location, l.Dimensions); } g.DrawImage(l.Image, rect); } } #if QUANTIZE if (bmp.PixelFormat != PixelFormat) { Bitmap ret; if (PixelFormat.IsIndexed()) { // then it needs quantizing OctreeQuantizer q = CreateQuantizer(PixelFormat); if (q == null) { throw new AnolisException("Invalid PixelFormat"); } ret = q.Quantize(bmp); } else { ret = new Bitmap(bmp.Width, bmp.Height, PixelFormat); using (Graphics g = Graphics.FromImage(ret)) { Rectangle r = new Rectangle(0, 0, bmp.Width, bmp.Height); g.DrawImage(bmp, r); } } bmp.Dispose(); return(ret); } #endif return(bmp); }