Example #1
0
        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);
            }
        }
Example #2
0
        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);
        }