void ColorDodgeLayer(Layer layer)
        {
            var layers   = ActiveImage.Layers;
            int index    = layers.GetIndex(layer);
            var previous = layers[index + 1];

            Console.WriteLine("layer: " + layer.Name);
            Console.WriteLine("previous: " + previous.Name);

            var srcPR  = new PixelRgn(previous, false, false);
            var destPR = new PixelRgn(layer, false, false);

#if false
            var iterator = new RegionIterator(srcPR, destPR);

            iterator.ForEach((src, dest) =>
            {
                dest.Red   = ColorDodge(src.Red, dest.Red);
                dest.Green = ColorDodge(src.Green, dest.Green);
                dest.Blue  = ColorDodge(src.Blue, dest.Blue);
            });
#else
            var iterator = new RegionIterator(destPR);

            iterator.ForEach((dest) =>
                             {});
#endif
        }
Exemple #2
0
        override protected Image Load(string filename)
        {
            if (File.Exists(filename))
            {
                ecw_wrapper_init();

                var view = FileView.Open(filename);
                view.Set();

                var info   = view.Info;
                int width  = (int)(info.SizeX - 1);
                int height = (int)(info.SizeY - 1);

                var image = NewImage(width, height, ImageBaseType.Rgb,
                                     ImageType.Rgb, filename);

                var rgn = new PixelRgn(image.Layers[0], true, false);

                var line = new byte[width * 3];

                for (int y = 0; y < height; y++)
                {
                    view.ReadLineRGB(line);
                    rgn.SetRow(line, 0, y, width);
                }

                view.Close();

                return(image);
            }
            return(null);
        }
Exemple #3
0
        protected override Image Load(string filename)
        {
            if (File.Exists(filename))
            {
              ecw_wrapper_init();

              var view = FileView.Open(filename);
              view.Set();

              var info = view.Info;
              int width = (int) (info.SizeX - 1);
              int height = (int) (info.SizeY - 1);

              var image = NewImage(width, height, ImageBaseType.Rgb,
                   ImageType.Rgb, filename);

              var rgn = new PixelRgn(image.Layers[0], true, false);

              var line = new byte[width * 3];

              for (int y = 0; y < height; y++)
            {
              view.ReadLineRGB(line);
              rgn.SetRow(line, 0, y, width);
            }

              view.Close();

              return image;
            }
              return null;
        }
Exemple #4
0
        override protected bool Save(Image image, Drawable drawable,
                                     string filename)
        {
            int width  = drawable.Width;
            int height = drawable.Height;

            if (!drawable.IsIndexed)
            {
                image.ConvertIndexed(ConvertDitherType.No, ConvertPaletteType.Mono,
                                     0, false, false, "");
            }

            var writer = new BinaryWriter(File.Open(filename, FileMode.Create));

            writer.Write((byte)0); // Write type
            writer.Write((byte)0); // Fixed header

            writer.Write(EncodeInteger(width));
            writer.Write(EncodeInteger(height));

            image.Flatten();

            var rgn       = new PixelRgn(drawable, true, false);
            var wbmpImage = new byte[(width + 7) / 8 * height];
            var buf       = rgn.GetRect(0, 0, width, height);

            for (int row = 0; row < height; row++)
            {
                for (int col = 0; col < width; col++)
                {
                    int offset = col / 8 + row * ((width + 7) / 8);
                    if (buf[row * width + col] != 0)
                    {
                        wbmpImage[offset] |= (byte)(1 << (7 - col % 8));
                    }
                    else
                    {
                        wbmpImage[offset] &= (byte)(~(1 << (7 - col % 8)));
                    }

                    // Check if it's at the end of the byte...
                    if (((col + 1) % 8 == 0) || ((col + 1) == width))
                    {
                        writer.Write(wbmpImage[offset]);
                    }
                }
            }

            writer.Close();

            return(true);
        }
Exemple #5
0
        override protected bool Save(Image image, Drawable drawable,
                                     string filename)
        {
            var writer = new BinaryWriter(File.Open(filename, FileMode.Create));

            var rgn = new PixelRgn(drawable, false, false);

            for (IntPtr pr = PixelRgn.Register(rgn); pr != IntPtr.Zero;
                 pr = PixelRgn.Process(pr))
            {
            }

            writer.Close();

            return(true);
        }
Exemple #6
0
        void DoDifference(Drawable sourceDrawable, Drawable toDiffDrawable)
        {
            _indexedColorsMap = new IndexedColorsMap();

            var rectangle = sourceDrawable.MaskBounds;
            var srcPR     = new PixelRgn(sourceDrawable, rectangle, true, true);
            var destPR    = new PixelRgn(toDiffDrawable, rectangle, false, false);

            var iterator = new RegionIterator(srcPR, destPR);

            iterator.ForEach((src, dest) => src.Set(MakeAbsDiff(dest, src)));

            sourceDrawable.Flush();
            sourceDrawable.MergeShadow(false);
            sourceDrawable.Update(rectangle);
        }
Exemple #7
0
 Pixel GetTrimColor(PixelRgn src, Drawable drawable)
 {
     int basedOn = GetValue<int>("based_on");
       if (basedOn == 0)
     {
       return new Pixel(0, 0, 0, 0);
     }
       else if (basedOn == 1)
     {
       return src[0, 0];
     }
       else
     {
       return src.GetPixel(drawable.Width - 1, drawable.Height - 1);
     }
 }
Exemple #8
0
        public void Render(Image image, Drawable drawable)
        {
            var src = new PixelRgn(drawable, false, false);
              PixelRgn.Register(src);

              var trimColor = GetTrimColor(src, drawable);

              var tb = GetLowerUpper(trimColor, src.Rows, "top", "bottom");
              var lr = GetLowerUpper(trimColor, src.Columns, "left", "right");

              var croppingArea = new Rectangle(lr.Item1, tb.Item1, lr.Item2, tb.Item2);
              if (croppingArea != image.Bounds)
            {
              image.Crop(croppingArea);
            }
        }
Exemple #9
0
        protected override Image Load()
        {
            if (ReadHeader())
            {
              var colormap = new RGB[] {
            new RGB(255,255,255),
            new RGB(255,0,0),
            new RGB(0,255,0),
            new RGB(255,255,0),
            new RGB(0,0,255),
            new RGB(255,0,255),
            new RGB(0,255,255),
            new RGB(181,181,181),
            new RGB(84,84,84),
            new RGB(127,0,0),
            new RGB(0,127,0),
            new RGB(127,127,0),
            new RGB(0,0,127),
            new RGB(127,0,127),
            new RGB(0,127,127),
            new RGB(0,0,0)
              };

              var image = NewImage(_imageWidth, _imageHeight,
                   ImageBaseType.Indexed,
                   ImageType.Indexed, Filename);
              image.Colormap = colormap;
              var rgn = new PixelRgn(image.Layers[0], true, false);

              int bparrow = (_imageWidth + 7) / 8;

              for (int y = 0; y < _imageHeight; )
            {
              // byte[] line = new byte[bparrow * 8];
              var line = new byte[_imageWidth];
              int count = ReadLine(line);
              do
            {
              rgn.SetRow(line, 0, y++);
            }
              while (--count > 0);
            }

              return image;
            }
              return null;
        }
Exemple #10
0
        override protected Image Load()
        {
            if (ReadHeader())
            {
                var colormap = new RGB[] {
                    new RGB(255, 255, 255),
                    new RGB(255, 0, 0),
                    new RGB(0, 255, 0),
                    new RGB(255, 255, 0),
                    new RGB(0, 0, 255),
                    new RGB(255, 0, 255),
                    new RGB(0, 255, 255),
                    new RGB(181, 181, 181),
                    new RGB(84, 84, 84),
                    new RGB(127, 0, 0),
                    new RGB(0, 127, 0),
                    new RGB(127, 127, 0),
                    new RGB(0, 0, 127),
                    new RGB(127, 0, 127),
                    new RGB(0, 127, 127),
                    new RGB(0, 0, 0)
                };

                var image = NewImage(_imageWidth, _imageHeight,
                                     ImageBaseType.Indexed,
                                     ImageType.Indexed, Filename);
                image.Colormap = colormap;
                var rgn = new PixelRgn(image.Layers[0], true, false);

                int bparrow = (_imageWidth + 7) / 8;

                for (int y = 0; y < _imageHeight;)
                {
                    // byte[] line = new byte[bparrow * 8];
                    var line  = new byte[_imageWidth];
                    int count = ReadLine(line);
                    do
                    {
                        rgn.SetRow(line, 0, y++);
                    }while (--count > 0);
                }

                return(image);
            }
            return(null);
        }
Exemple #11
0
        Pixel GetTrimColor(PixelRgn src, Drawable drawable)
        {
            int basedOn = GetValue <int>("based_on");

            if (basedOn == 0)
            {
                return(new Pixel(0, 0, 0, 0));
            }
            else if (basedOn == 1)
            {
                return(src[0, 0]);
            }
            else
            {
                return(src.GetPixel(drawable.Width - 1, drawable.Height - 1));
            }
        }
Exemple #12
0
        public void Render(Image image, Drawable drawable)
        {
            var src = new PixelRgn(drawable, false, false);

            PixelRgn.Register(src);

            var trimColor = GetTrimColor(src, drawable);

            var tb = GetLowerUpper(trimColor, src.Rows, "top", "bottom");
            var lr = GetLowerUpper(trimColor, src.Columns, "left", "right");

            var croppingArea = new Rectangle(lr.Item1, tb.Item1, lr.Item2, tb.Item2);

            if (croppingArea != image.Bounds)
            {
                image.Crop(croppingArea);
            }
        }
Exemple #13
0
        Layer AddLayer(Image image, int layerNr, string name,
                       string translate_x, string translate_y,
                       out PixelRgn destPR)
        {
            destPR = null;
            int keepLayer = GetValue <int>("keep_layer");

            if (keepLayer == 0 || keepLayer == layerNr)
            {
                var layer = new Layer(image, name, ImageType.Rgba);
                layer.Translate(GetValue <int>(translate_x), GetValue <int>(translate_y));
                layer.AddAlpha();
                image.InsertLayer(layer, 0);

                destPR = new PixelRgn(layer, image.Bounds, true, false);
                return(layer);
            }
            return(null);
        }
Exemple #14
0
        override protected Image Load()
        {
            ReadBytes(2);
            var bitmap = ReadBytes(8000);

            _mcolor     = ReadBytes(1000);
            _color      = ReadBytes(1000);
            _background = ReadByte();

            var image = NewImage(KOALA_WIDTH, KOALA_HEIGHT,
                                 ImageBaseType.Indexed, ImageType.Indexed,
                                 Filename);

            image.Colormap = GetColormap();

            var rgn = new PixelRgn(image.Layers[0], true, false);

            var buf  = new byte[KOALA_WIDTH * KOALA_HEIGHT];
            int bufp = 8;

            for (int row = 0; row < KOALA_HEIGHT; row++)
            {
                for (int col = 0; col < KOALA_WIDTH / 8; col++)
                {
                    byte p = bitmap[(row / 8) * KOALA_WIDTH + row % 8 + col * 8];

                    for (int i = 0; i < 4; i++)
                    {
                        byte index = GetColor(row / 8, col, p & 3);
                        buf[--bufp] = index;
                        buf[--bufp] = index;
                        p         >>= 2;
                    }
                    bufp += 16;
                }
            }

            rgn.SetRect(buf, 0, 0, KOALA_WIDTH, KOALA_HEIGHT);

            return(image);
        }
Exemple #15
0
        protected override Image Load()
        {
            ReadBytes(2);
              var bitmap = ReadBytes(8000);
              _mcolor = ReadBytes(1000);
              _color = ReadBytes(1000);
              _background = ReadByte();

              var image = NewImage(KOALA_WIDTH, KOALA_HEIGHT,
               ImageBaseType.Indexed, ImageType.Indexed,
               Filename);
              image.Colormap = GetColormap();

              var rgn = new PixelRgn(image.Layers[0], true, false);

              var buf = new byte[KOALA_WIDTH * KOALA_HEIGHT];
              int bufp = 8;

              for (int row = 0; row < KOALA_HEIGHT; row++)
            {
              for (int col = 0; col < KOALA_WIDTH / 8; col++)
            {
              byte p = bitmap[(row / 8) * KOALA_WIDTH + row % 8 + col * 8];

              for (int i = 0; i < 4; i++)
            {
              byte index = GetColor(row / 8, col, p & 3);
              buf[--bufp] = index;
              buf[--bufp] = index;
              p >>= 2;
            }
              bufp += 16;
            }
            }

              rgn.SetRect(buf, 0, 0, KOALA_WIDTH, KOALA_HEIGHT);

              return image;
        }
Exemple #16
0
        public void Render(Image image, Drawable drawable)
        {
            var parser = new MathExpressionParser();
              parser.Init(GetValue<string>("formula"), image.Dimensions);

              var newImage = new Image(image.Dimensions, image.BaseType);
              var srcPR = new PixelRgn(drawable, image.Bounds, false, false);

              PixelRgn destPR1 = null;
              var layer1 = AddLayer(newImage, 1, _("layer_one"), "translate_1_x",
                "translate_1_y", out destPR1);

              PixelRgn destPR2 = null;
              var layer2 = AddLayer(newImage, 2, _("layer_two"), "translate_2_x",
                "translate_2_y", out destPR2);

              var transparent = new Pixel(4);

              if (destPR1 != null && destPR2 != null)
            {
              var iterator = new RegionIterator(srcPR, destPR1, destPR2);
              iterator.ForEach((src, dest1, dest2) =>
            {
              var tmp = Copy(src);
              if (parser.Eval(src) < 0)
              {
            dest1.Set(tmp);
            dest2.Set(transparent);
              }
              else
              {
            dest2.Set(tmp);
            dest1.Set(transparent);
              }
            });
            }
              else if (destPR1 != null)
            {
              var iterator = new RegionIterator(srcPR, destPR1);
              iterator.ForEach((src, dest) =>
               dest.Set((parser.Eval(src) < 0)
                    ? Copy(src) : transparent));
            }
              else	// destPR2 != null
            {
              var iterator = new RegionIterator(srcPR, destPR2);
              iterator.ForEach((src, dest) =>
               dest.Set((parser.Eval(src) >= 0)
                    ? Copy(src) : transparent));
            }

              Rotate(layer1, GetValue<int>("rotate_1"));
              Rotate(layer2, GetValue<int>("rotate_2"));

              if (GetValue<bool>("merge"))
            {
              var merged =
            newImage.MergeVisibleLayers(MergeType.ExpandAsNecessary);
              merged.Offsets = new Offset(0, 0);
              newImage.Resize(merged.Dimensions, merged.Offsets);
            }

              new Display(newImage);

              Display.DisplaysFlush();
        }
Exemple #17
0
        Layer AddLayer(Image image, int layerNr, string name, 
		   string translate_x, string translate_y, 
		   out PixelRgn destPR)
        {
            destPR = null;
              int keepLayer = GetValue<int>("keep_layer");
              if (keepLayer == 0 || keepLayer == layerNr)
            {
              var layer = new Layer(image, name, ImageType.Rgba);
              layer.Translate(GetValue<int>(translate_x), GetValue<int>(translate_y));
              layer.AddAlpha();
              image.InsertLayer(layer, 0);

              destPR = new PixelRgn(layer, image.Bounds, true, false);
              return layer;
            }
              return null;
        }
Exemple #18
0
        void DoDifference(Drawable sourceDrawable, Drawable toDiffDrawable)
        {
            _indexedColorsMap = new IndexedColorsMap();

              var rectangle = sourceDrawable.MaskBounds;
              var srcPR = new PixelRgn(sourceDrawable, rectangle, true, true);
              var destPR = new PixelRgn(toDiffDrawable, rectangle, false, false);

              var iterator = new RegionIterator(srcPR, destPR);
              iterator.ForEach((src, dest) => src.Set(MakeAbsDiff(dest, src)));

              sourceDrawable.Flush();
              sourceDrawable.MergeShadow(false);
              sourceDrawable.Update(rectangle);
        }
        void ColorDodgeLayer(Layer layer)
        {
            var layers = ActiveImage.Layers;
              int index = layers.GetIndex(layer);
              var previous = layers[index + 1];

              Console.WriteLine("layer: " + layer.Name);
              Console.WriteLine("previous: " + previous.Name);

              var srcPR = new PixelRgn(previous, false, false);
              var destPR = new PixelRgn(layer, false, false);

            #if false

              var iterator = new RegionIterator(srcPR, destPR);

              iterator.ForEach((src, dest) =>
            {
              dest.Red = ColorDodge(src.Red, dest.Red);
              dest.Green = ColorDodge(src.Green, dest.Green);
              dest.Blue = ColorDodge(src.Blue, dest.Blue);
            });
            #else
              var iterator = new RegionIterator(destPR);

              iterator.ForEach((dest) =>
            {});
            #endif
        }
Exemple #20
0
        override protected void Render(Image image, Drawable drawable)
        {
            var progress = new Progress(_("Colorizing..."));

            var rectangle = drawable.MaskIntersect;
            // Fix me: replace with x1, y1, x2, y2
            int i  = rectangle.X1;
            int j  = rectangle.Y1;
            int ii = rectangle.X2;
            int jj = rectangle.Y2;

            bool hasSel = (rectangle != null);

            if (!hasSel || _useEntireImage)
            {
                j  = i = 0;
                jj = image.Width;
                ii = image.Height;
            }

            Drawable sel       = null;
            int      threshGuc = (int)(_thresh * 255);
            PixelRgn selRgn    = null;

            if (hasSel)
            {
                sel    = image.Selection;
                selRgn = new PixelRgn(sel, rectangle, false, false);
            }

            var srcRgn  = new PixelRgn(drawable, rectangle, false, false);
            var dstRgn  = new PixelRgn(drawable, rectangle, true, true);
            var markRgn = new PixelRgn(_marked, rectangle, false, false);

            int h = srcRgn.H;
            int w = srcRgn.W;

            var A  = new double[WindowPixels, h *w];
            var AI = new int[WindowPixels * h * w];
            var AJ = new int[WindowPixels * h * w];

            var Y = new double[h, w];
            var I = new double[h, w];
            var Q = new double[h, w];

            double[,] inI = null;
            double[,] inQ = null;
            if (_useChroma)
            {
                inI = new double[h, w];
                inQ = new double[h, w];
            }

            bool[,] mask = new bool[h, w];

            Tile.CacheDefault(drawable);

            if (sel != null)
            {
                // Retarded check for selections, because gimp doesn't
                // _REALLY_ return FALSE when there's no selection.
                if (j == 0 && i == 0 && jj == drawable.Width &&
                    ii == drawable.Height)
                {
                    bool goodSelection = false;
                    foreach (var pixel in
                             new ReadPixelIterator(sel, RunMode.Noninteractive))
                    {
                        if (pixel[0] != 0)
                        {
                            goodSelection = true;
                            break;
                        }
                    }
                    if (!goodSelection)
                    {
                        sel.Detach();
                        sel = null;
                    }
                }
            }

            Pixel[] selRow     = null;
            var     whitePixel = new Pixel(255, 255, 255);

            for (i = 0; i < h; i++)
            {
                var imgRow  = srcRgn.GetRow(srcRgn.X, srcRgn.Y + i, w);
                var markRow = markRgn.GetRow(markRgn.X, markRgn.Y + i, w);

                if (sel != null)
                {
                    selRow = selRgn.GetRow(selRgn.X, selRgn.Y + i, w);
                }

                for (j = 0; j < w; j++)
                {
                    var imgPixel  = imgRow[j];
                    var markPixel = markRow[j];
                    int selIdx    = (sel != null) ? j : 0;

                    double iY, iI, iQ;
                    double mY;

                    rgb2yiq(imgPixel, out iY, out iI, out iQ);

                    if (_useChroma)
                    {
                        inI[i, j] = iI;
                        inQ[i, j] = iQ;
                    }

                    if (_includeOriginal)
                    {
                        var diff  = imgPixel - markPixel;;
                        int delta = Math.Abs(diff.Red) + Math.Abs(diff.Green) +
                                    Math.Abs(diff.Blue);
                    }

                    // big dirty if statement
                    if (_pureWhite && markPixel.IsSameColor(whitePixel))
                    {
                        mask[i, j] = true;
                    }
                    else if ((_includeOriginal && !imgPixel.IsSameColor(markPixel)) ||
                             (!_includeOriginal && markPixel.Alpha >= threshGuc))
                    {
                        mask[i, j] = true;
                        rgb2yiq(markPixel, out mY, out iI, out iQ);
                    }
                    else if (sel != null && selRow[selIdx].Red < threshGuc)
                    {
                        mask[i, j] = true;
                    }
                    else
                    {
                        mask[i, j] = false;
                        iI         = iQ = 0;
                    }

                    Y[i, j] = iY;
                    I[i, j] = iI;
                    Q[i, j] = iQ;
                }
            }

            if (sel != null)
            {
                sel.Detach();
            }

            progress.Update(0.1);

            int n = 0;

            for (i = 0; i < h; i++)
            {
                for (j = 0; j < w; j++)
                {
                    if (!mask[i, j])
                    {
                        int min_ii = Math.Max(0, i - WindowRadius);
                        int max_ii = Math.Min(h - 1, i + WindowRadius);
                        int min_jj = Math.Max(0, j - WindowRadius);
                        int max_jj = Math.Min(w - 1, j + WindowRadius);
                        var vary   = new int[WindowPixels];
                        var varx   = new int[WindowPixels];
                        var var    = new double[WindowPixels];

                        int    count        = 0;
                        double sum_sq       = 0;
                        double sum          = 0;
                        double min_variance = 1.0;

                        for (ii = min_ii; ii <= max_ii; ii++)
                        {
                            for (jj = min_jj; jj <= max_jj; jj++)
                            {
                                double val = Y[ii, jj];
                                sum    += val;
                                sum_sq += val * val;

                                if (ii == i && jj == j)
                                {
                                    continue;
                                }

                                vary[count] = i * w + j;
                                varx[count] = ii * w + jj;
                                var[count]  = val - Y[i, j];
                                var[count] *= var[count];
                                if (_useChroma)
                                {
                                    val         = inI[ii, jj] - inI[i, j];
                                    var[count] += val * val;
                                    val         = inQ[ii, jj] - inQ[i, j];
                                    var[count] += val * val;
                                }
                                if (var[count] < min_variance)
                                {
                                    min_variance = var[count];
                                }
                                ++count;
                            }
                        }

                        double sigma =
                            (sum_sq - (sum * sum) / (double)(count + 1)) / (double)count;
                        if (sigma < 0.000002)
                        {
                            sigma = 0.000002;
                        }
                        else if (sigma < (min_variance / LN_100))
                        {
                            sigma = min_variance / LN_100;
                        }

                        sum = 0;
                        for (ii = 0; ii < count; ii++)
                        {
                            var[ii] = Math.Exp(-var[ii] / sigma);
                            sum    += var[ii];
                        }

                        for (ii = 0; ii < count; ii++)
                        {
                            AI[n] = vary[ii];
                            AJ[n] = varx[ii];
                            // Fix me: just A[i, j]?
                            A[n / (h * w), n % (h * w)] = -var[ii] / sum;
                            ++n;
                        }
                    }

                    AI[n] = AJ[n] = i * w + j;
                    // Fix me: just A[i, j]?
                    A[n / (h * w), n % (h * w)] = 1.0;
                    ++n;
                }
            }

            UmfPack umf = new UmfPack();

            umf.Defaults();

            var Ax  = new double[WindowPixels, h *w];
            var Ap  = new int[h * w + 1];
            var Ai  = new int[WindowPixels * h * w];
            var Map = new int[WindowPixels * h * w];

            umf.TripletToCol(h * w, h * w, n, AI, AJ, A, Ap, Ai, Ax, Map);

            umf.Symbolic(h * w, h * w, Ap, Ai, Ax);
            umf.Numeric(Ap, Ai, Ax);
            umf.FreeSymbolic();

            progress.Update(0.3);

            var outI = new double[h, w];
            var outQ = new double[h, w];

            umf.Solve(Ap, Ai, Ax, outI, I);

            progress.Update(0.6);

            umf.Solve(Ap, Ai, Ax, outQ, Q);
            umf.FreeNumeric();

            progress.Update(0.9);

            for (i = 0; i < h; i++)
            {
                // FIXME: This is only for the alpha channel..
                var imgRow = srcRgn.GetRow(srcRgn.X, srcRgn.Y + i, w);

                for (j = 0; j < w; j++)
                {
                    yiq2rgb(Y[i, j], outI[i, j], outQ[i, j], imgRow[j]);
                }

                dstRgn.SetRow(imgRow, dstRgn.X, dstRgn.Y + i);
            }

            drawable.Flush();
            drawable.MergeShadow(true);
            drawable.Update(dstRgn.X, dstRgn.Y, dstRgn.W, dstRgn.H);

            progress.Update(1.0);
        }
Exemple #21
0
        override protected Image Load()
        {
            int layerPosition = 0;
            int colorOffset   = 0;

            var document = Document.FromStream(Reader.BaseStream);

            Console.WriteLine("Width  : " + document.Width);
            Console.WriteLine("height : " + document.Height);

            var image = new Image(document.Width, document.Height,
                                  ImageBaseType.Rgb); // Is it the best type ?

            image.Filename = Filename;

            PaintDotNet.LayerList layers = document.Layers;
            Console.WriteLine("#layers: " + layers.Count);

            foreach (PaintDotNet.Layer readLayer in layers)
            {
                try
                {
                    Console.WriteLine(readLayer.Name);

                    var layer = new Layer(image, readLayer.Name,
                                          document.Width, document.Height,
                                          ImageType.Rgba,
                                          (readLayer.Opacity / 255) * 100, // 100 what means ?
                                          LayerModeEffects.Normal);
                    Console.WriteLine("11");
                    image.AddLayer(layer, layerPosition++);

                    Console.WriteLine("1");

                    var rgn = new PixelRgn(layer, 0, 0,
                                           document.Width, document.Height,
                                           true, false);

                    var buf                = new byte[document.Width * document.Height * 4];
                    var color_conv_ary     = new byte[4];
                    int lastPixelConverted = 0;
                    colorOffset = 0;
                    var surf = (readLayer as BitmapLayer).Surface;

                    for (int row = 0; row < document.Height; row++)
                    {
                        var memory      = surf.GetRow(row);
                        var bitmapBytes = memory.ToByteArray();
                        lastPixelConverted = 0;
                        colorOffset        = 0;
                        for (int col = 0; col < document.Width * 4; col++)
                        {
                            color_conv_ary[colorOffset++] = bitmapBytes[col];
                            //							Console.WriteLine("ColorOffset = " + colorOffset);

                            if (colorOffset >= 4)
                            {
                                var tmpArray = FromBGRAToRGBA(color_conv_ary);

                                for (int j = 0; j < colorOffset; j++)
                                {
                                    //									buf[row * document.Height + (lastPixelConverted++)] = tmpArray[j];
                                    buf[(row * document.Width * 4) + (lastPixelConverted++)] = tmpArray[j];

                                    /*										Console.WriteLine("Scritto il byte[" + ((row *
                                     *                                                                                document.Width * 4) + (lastPixelConverted-1)) + "] : " +
                                     *                                                                                tmpArray[j]);*/
                                }
                                colorOffset = 0;
                            }

                            //							buf[row * document.Height + col] =  bitmapBytes[col]; //0x7F;
                        }
                        //						Console.WriteLine(memory.Length);
                    }
                    //					Console.ReadLine();

                    rgn.SetRect(buf, 0, 0,
                                document.Width, document.Height);
                    layer.Flush();
                }
                catch (Exception e)
                {
                    Console.WriteLine("Exception : " + e.Message + " - " +
                                      e.StackTrace);
                }
            }
            // missing colormap, mcolor and background

            Console.WriteLine("2");

            /* var surface = (layers[0] as BitmapLayer).Surface;
             * var memory1 = surface.GetRow(13);
             * var bytes = memory1.ToByteArray();
             * Console.WriteLine("length: " + bytes.Length);*/

            return(image);
        }
Exemple #22
0
        protected override bool Save(Image image, Drawable drawable, 
				 string filename)
        {
            int width = drawable.Width;
              int height = drawable.Height;

              if (!drawable.IsIndexed)
            {
              image.ConvertIndexed(ConvertDitherType.No, ConvertPaletteType.Mono,
                   0, false, false, "");
            }

              var writer = new BinaryWriter(File.Open(filename, FileMode.Create));

              writer.Write((byte) 0);	// Write type
              writer.Write((byte) 0);	// Fixed header

              writer.Write(EncodeInteger(width));
              writer.Write(EncodeInteger(height));

              image.Flatten();

              var rgn = new PixelRgn(drawable, true, false);
              var wbmpImage = new byte[(width + 7) / 8 * height];
              var buf = rgn.GetRect(0, 0, width, height);

              for (int row = 0; row < height; row++)
            {
              for (int col = 0; col < width; col++)
            {
              int offset = col / 8 + row * ((width + 7) / 8);
              if (buf[row * width + col] != 0)
            {
              wbmpImage[offset] |= (byte)(1 << (7 - col % 8));
            }
              else
            {
              wbmpImage[offset] &= (byte)(~(1 << (7 - col % 8)));
            }

              // Check if it's at the end of the byte...
              if (((col + 1) % 8 == 0) || ((col + 1) == width))
            {
              writer.Write(wbmpImage[offset]);
            }
            }
            }

              writer.Close();

              return true;
        }
Exemple #23
0
        protected override Image Load()
        {
            int layerPosition = 0;
              int colorOffset = 0;

              var document = Document.FromStream(Reader.BaseStream);

              Console.WriteLine("Width  : " + document.Width);
              Console.WriteLine("height : " + document.Height);

              var image = new Image(document.Width, document.Height,
                ImageBaseType.Rgb); // Is it the best type ?
              image.Filename = Filename;

              PaintDotNet.LayerList layers = document.Layers;
              Console.WriteLine("#layers: " + layers.Count);

              foreach (PaintDotNet.Layer readLayer in layers)
            {
              try
            {
              Console.WriteLine(readLayer.Name);

              var layer = new Layer(image, readLayer.Name,
                    document.Width, document.Height,
                    ImageType.Rgba,
                    (readLayer.Opacity / 255) * 100, // 100 what means ?
                    LayerModeEffects.Normal);
              Console.WriteLine("11");
              image.AddLayer(layer, layerPosition++);

              Console.WriteLine("1");

              var rgn = new PixelRgn(layer, 0, 0,
                     document.Width, document.Height,
                     true, false);

              var buf = new byte[document.Width * document.Height * 4];
              var color_conv_ary = new byte[4];
              int lastPixelConverted = 0;
              colorOffset = 0;
              var surf = (readLayer as BitmapLayer).Surface;

              for (int row = 0; row < document.Height; row++)
            {
              var memory = surf.GetRow(row);
              var bitmapBytes = memory.ToByteArray();
              lastPixelConverted = 0;
              colorOffset = 0;
              for (int col = 0; col < document.Width * 4; col++)
            {
              color_conv_ary[colorOffset++] = bitmapBytes[col];
              //							Console.WriteLine("ColorOffset = " + colorOffset);

              if (colorOffset >= 4)
            {
              var tmpArray = FromBGRAToRGBA(color_conv_ary);

              for (int j = 0; j < colorOffset; j++)
                {
                  //									buf[row * document.Height + (lastPixelConverted++)] = tmpArray[j];
                  buf[(row * document.Width * 4) + (lastPixelConverted++)] = tmpArray[j];

                  /*										Console.WriteLine("Scritto il byte[" + ((row *
                                                        document.Width * 4) + (lastPixelConverted-1)) + "] : " +
                                                        tmpArray[j]);*/
                }
              colorOffset = 0;
            }

              //							buf[row * document.Height + col] =  bitmapBytes[col]; //0x7F;
            }
              //						Console.WriteLine(memory.Length);
            }
              //					Console.ReadLine();

              rgn.SetRect(buf, 0, 0,
              document.Width, document.Height);
              layer.Flush();
            }
              catch (Exception e)
            {
              Console.WriteLine("Exception : " + e.Message + " - " +
                e.StackTrace);
            }
            }
              // missing colormap, mcolor and background

              Console.WriteLine("2");

              /* var surface = (layers[0] as BitmapLayer).Surface;
             var memory1 = surface.GetRow(13);
             var bytes = memory1.ToByteArray();
             Console.WriteLine("length: " + bytes.Length);*/

              return image;
        }
Exemple #24
0
        protected override void Render(Image image, Drawable drawable)
        {
            var progress = new Progress(_("Colorizing..."));

              var rectangle = drawable.MaskIntersect;
              // Fix me: replace with x1, y1, x2, y2
              int i = rectangle.X1;
              int j = rectangle.Y1;
              int ii = rectangle.X2;
              int jj = rectangle.Y2;

              bool hasSel = (rectangle != null);
              if (!hasSel || _useEntireImage)
            {
              j = i = 0;
              jj = image.Width;
              ii = image.Height;
            }

              Drawable sel = null;
              int threshGuc = (int) (_thresh * 255);
              PixelRgn selRgn = null;

              if (hasSel)
            {
              sel = image.Selection;
              selRgn = new PixelRgn(sel, rectangle, false, false);
            }

              var srcRgn = new PixelRgn(drawable, rectangle, false, false);
              var dstRgn = new PixelRgn(drawable, rectangle, true, true);
              var markRgn = new PixelRgn(_marked, rectangle, false, false);

              int h = srcRgn.H;
              int w = srcRgn.W;

              var A = new double[WindowPixels, h * w];
              var AI = new int[WindowPixels * h * w];
              var AJ = new int[WindowPixels * h * w];

              var Y = new double[h, w];
              var I = new double[h, w];
              var Q = new double[h, w];

              double[,] inI = null;
              double[,] inQ = null;
              if (_useChroma)
            {
              inI = new double[h, w];
              inQ = new double[h, w];
            }

              bool[,] mask = new bool[h, w];

              Tile.CacheDefault(drawable);

              if (sel != null)
            {
              // Retarded check for selections, because gimp doesn't
              // _REALLY_ return FALSE when there's no selection.
              if (j == 0 && i == 0 && jj == drawable.Width &&
              ii == drawable.Height)
            {
              bool goodSelection = false;
              foreach (var pixel in
               new ReadPixelIterator(sel, RunMode.Noninteractive))
            {
              if (pixel[0] != 0)
            {
              goodSelection = true;
              break;
            }
            }
              if (!goodSelection)
            {
              sel.Detach();
              sel = null;
            }
            }
            }

              Pixel[] selRow = null;
              var whitePixel = new Pixel(255, 255, 255);

              for (i = 0; i < h; i++)
            {
              var imgRow = srcRgn.GetRow(srcRgn.X, srcRgn.Y + i, w);
              var markRow = markRgn.GetRow(markRgn.X, markRgn.Y + i, w);

              if (sel != null)
              {
            selRow = selRgn.GetRow(selRgn.X, selRgn.Y + i, w);
              }

              for (j = 0; j < w; j++)
            {
              var imgPixel = imgRow[j];
              var markPixel = markRow[j];
              int selIdx = (sel != null) ? j : 0;

              double iY, iI, iQ;
              double mY;

              rgb2yiq(imgPixel, out iY, out iI, out iQ);

              if (_useChroma)
            {
              inI[i, j] = iI;
              inQ[i, j] = iQ;
            }

              if (_includeOriginal)
            {
              var diff = imgPixel - markPixel;;
              int delta = Math.Abs(diff.Red) + Math.Abs(diff.Green) +
            Math.Abs(diff.Blue);
            }

              // big dirty if statement
              if (_pureWhite && markPixel.IsSameColor(whitePixel))
            {
              mask[i, j] = true;
            }
              else if ((_includeOriginal && !imgPixel.IsSameColor(markPixel))
               || (!_includeOriginal && markPixel.Alpha >= threshGuc))
            {
              mask[i, j] = true;
              rgb2yiq(markPixel, out mY, out iI, out iQ);
            }
              else if (sel != null && selRow[selIdx].Red < threshGuc)
            {
              mask[i, j] = true;
            }
              else {
              mask[i, j] = false;
              iI = iQ = 0;
              }

              Y[i, j] = iY;
              I[i, j] = iI;
              Q[i, j] = iQ;
            }
            }

              if (sel != null)
            {
              sel.Detach();
            }

              progress.Update(0.1);

              int n = 0;
              for (i = 0; i < h; i++)
            {
              for (j = 0; j < w; j++)
            {
              if (!mask[i, j])
            {
              int min_ii = Math.Max(0, i - WindowRadius);
              int max_ii = Math.Min(h - 1, i + WindowRadius);
              int min_jj = Math.Max(0, j - WindowRadius);
              int max_jj = Math.Min(w - 1, j + WindowRadius);
              var vary = new int[WindowPixels];
              var varx = new int[WindowPixels];
              var var = new double[WindowPixels];

              int count = 0;
              double sum_sq = 0;
              double sum = 0;
              double min_variance = 1.0;

              for (ii = min_ii; ii <= max_ii; ii++)
            {
              for (jj = min_jj; jj <= max_jj; jj++)
            {
              double val = Y[ii, jj];
              sum += val;
              sum_sq += val * val;

              if (ii == i && jj == j)
                continue;

              vary[count] = i * w + j;
              varx[count] = ii * w + jj;
              var[count] = val - Y[i, j];
              var[count] *= var[count];
              if (_useChroma)
                {
                  val = inI[ii, jj] - inI[i, j];
                  var[count] += val * val;
                  val = inQ[ii, jj] - inQ[i, j];
                  var[count] += val * val;
                }
              if (var[count] < min_variance)
                min_variance = var[count];
              ++count;
            }
            }

              double sigma =
            (sum_sq - (sum * sum)/(double)(count + 1)) / (double)count;
              if (sigma < 0.000002)
            sigma = 0.000002;
              else if (sigma < (min_variance / LN_100))
            sigma = min_variance / LN_100;

              sum = 0;
              for (ii = 0; ii < count; ii++)
            {
              var[ii] = Math.Exp(-var[ii] / sigma);
              sum += var[ii];
            }

              for (ii = 0; ii < count; ii++)
            {
              AI[n] = vary[ii];
              AJ[n] = varx[ii];
              // Fix me: just A[i, j]?
              A[n / (h * w) , n % (h * w)] = -var[ii] / sum;
              ++n;
            }
            }

              AI[n] = AJ[n] = i * w + j;
              // Fix me: just A[i, j]?
              A[n / (h * w), n % (h * w)] = 1.0;
              ++n;
            }
            }

              UmfPack umf = new UmfPack();
              umf.Defaults();

              var Ax = new double[WindowPixels, h * w];
              var Ap = new int[h * w + 1];
              var Ai = new int[WindowPixels * h * w];
              var Map = new int[WindowPixels * h * w];

              umf.TripletToCol(h * w, h * w, n, AI, AJ, A, Ap, Ai, Ax, Map);

              umf.Symbolic(h * w, h * w, Ap, Ai, Ax);
              umf.Numeric(Ap, Ai, Ax);
              umf.FreeSymbolic();

              progress.Update(0.3);

              var outI = new double[h, w];
              var outQ = new double[h, w];

              umf.Solve(Ap, Ai, Ax, outI, I);

              progress.Update(0.6);

              umf.Solve(Ap, Ai, Ax, outQ, Q);
              umf.FreeNumeric();

              progress.Update(0.9);

              for (i = 0; i < h; i++)
            {
              // FIXME: This is only for the alpha channel..
              var imgRow = srcRgn.GetRow(srcRgn.X, srcRgn.Y + i, w);

              for (j = 0; j < w; j++)
            {
              yiq2rgb(Y[i, j], outI[i, j], outQ[i, j], imgRow[j]);
            }

              dstRgn.SetRow(imgRow, dstRgn.X, dstRgn.Y + i);
              }

              drawable.Flush();
              drawable.MergeShadow(true);
              drawable.Update(dstRgn.X, dstRgn.Y, dstRgn.W, dstRgn.H);

              progress.Update(1.0);
        }
Exemple #25
0
        protected override bool Save(Image image, Drawable drawable, 
            string filename)
        {
            var writer = new BinaryWriter(File.Open(filename, FileMode.Create));

              var rgn = new PixelRgn(drawable, false, false);
              for (IntPtr pr = PixelRgn.Register(rgn); pr != IntPtr.Zero;
               pr = PixelRgn.Process(pr))
            {
            }

              writer.Close();

              return true;
        }
Exemple #26
0
        public void Render(Image image, Drawable drawable)
        {
            var parser = new MathExpressionParser();

            parser.Init(GetValue <string>("formula"), image.Dimensions);

            var newImage = new Image(image.Dimensions, image.BaseType);
            var srcPR    = new PixelRgn(drawable, image.Bounds, false, false);

            PixelRgn destPR1 = null;
            var      layer1  = AddLayer(newImage, 1, _("layer_one"), "translate_1_x",
                                        "translate_1_y", out destPR1);

            PixelRgn destPR2 = null;
            var      layer2  = AddLayer(newImage, 2, _("layer_two"), "translate_2_x",
                                        "translate_2_y", out destPR2);

            var transparent = new Pixel(4);

            if (destPR1 != null && destPR2 != null)
            {
                var iterator = new RegionIterator(srcPR, destPR1, destPR2);
                iterator.ForEach((src, dest1, dest2) =>
                {
                    var tmp = Copy(src);
                    if (parser.Eval(src) < 0)
                    {
                        dest1.Set(tmp);
                        dest2.Set(transparent);
                    }
                    else
                    {
                        dest2.Set(tmp);
                        dest1.Set(transparent);
                    }
                });
            }
            else if (destPR1 != null)
            {
                var iterator = new RegionIterator(srcPR, destPR1);
                iterator.ForEach((src, dest) =>
                                 dest.Set((parser.Eval(src) < 0)
                                    ? Copy(src) : transparent));
            }
            else // destPR2 != null
            {
                var iterator = new RegionIterator(srcPR, destPR2);
                iterator.ForEach((src, dest) =>
                                 dest.Set((parser.Eval(src) >= 0)
                                    ? Copy(src) : transparent));
            }

            Rotate(layer1, GetValue <int>("rotate_1"));
            Rotate(layer2, GetValue <int>("rotate_2"));

            if (GetValue <bool>("merge"))
            {
                var merged =
                    newImage.MergeVisibleLayers(MergeType.ExpandAsNecessary);
                merged.Offsets = new Offset(0, 0);
                newImage.Resize(merged.Dimensions, merged.Offsets);
            }

            new Display(newImage);

            Display.DisplaysFlush();
        }