Esempio n. 1
0
        /// <summary>
        ///
        /// </summary>
        /// <param name="layer"></param>
        /// <param name="indirectFilter"></param>
        public void Apply(string name, int border, ImageIndirectFilter filter)
        {
            int        width;
            BitmapData bdCurrent, bdOriginal;
            Bitmap     original;
            IndirectFilterGetDelegate getDelegateParent;
            PixelGet getDelegate;

            original          = new Bitmap(this.image);
            bdOriginal        = Lock(ref original, ImageLockMode.ReadWrite, out width);
            bdCurrent         = Lock(ref this.image, ImageLockMode.ReadWrite, out width);
            getDelegateParent = new IndirectFilterGetDelegate(width, original, bdOriginal);
            int min_i = Math.Max(border, this.activeRegion.Left);
            int max_i = Math.Min(this.activeRegion.Right, this.activeRegion.Right - border);
            int min_j = Math.Max(border, this.activeRegion.Top);
            int max_j = Math.Min(this.activeRegion.Bottom, this.activeRegion.Bottom - border);

            unsafe
            {
                PixelData *pPixel;
                getDelegate = new PixelGet(getDelegateParent.GetPixel);

                for (int j = min_j; j < max_j; j++)
                {
                    pPixel = (PixelData *)(((byte *)bdCurrent.Scan0.ToPointer()) + j * width + this.activeRegion.Left * sizeof(PixelData));
                    for (int i = min_i; i < max_i; i++, pPixel++)
                    {
                        filter(i, j, getDelegate, pPixel, this.activeRegion.Left, this.activeRegion.Top, this.activeRegion.Right - 1, this.activeRegion.Bottom - 1);
                    }
                }
            }
            this.image.UnlockBits(bdCurrent);
            original.UnlockBits(bdOriginal);
            OnChanged(new ImageChangedEventArgs(name, original));
        }
Esempio n. 2
0
        public void Init()
        {
            bool fastPath = bmp.PixelFormat == PixelFormat.Format32bppRgb ||
                            bmp.PixelFormat == PixelFormat.Format32bppArgb ||
                            bmp.PixelFormat == PixelFormat.Format24bppRgb;

            if (!fastPath)
            {
                Get = GetGenericPixel; return;
            }
            // We can only use the fast path for 24bpp or 32bpp bitmaps

            Rectangle r = new Rectangle(0, 0, bmp.Width, bmp.Height);

            data   = bmp.LockBits(r, ImageLockMode.ReadOnly, bmp.PixelFormat);
            scan0  = (byte *)data.Scan0;
            stride = data.Stride;

            if (bmp.PixelFormat == PixelFormat.Format24bppRgb)
            {
                Get = Get24BppPixel;
            }
            else
            {
                Get = Get32BppPixel;
            }
        }
Esempio n. 3
0
        protected unsafe void applyConvolution3x3(int x, int y, PixelGet getPixel, PixelData *pPixel)
        {
            var pPixelClone1 = getPixel(x - 1, y + 1);
            var pPixelClone2 = getPixel(x, y + 1);
            var pPixelClone3 = getPixel(x + 1, y + 1);
            var pPixelClone4 = getPixel(x - 1, y);
            var pPixelClone5 = getPixel(x, y);
            var pPixelClone6 = getPixel(x + 1, y);
            var pPixelClone7 = getPixel(x - 1, y - 1);
            var pPixelClone8 = getPixel(x, y - 1);
            var pPixelClone9 = getPixel(x + 1, y - 1);

            int tmp = Offset + (_matrix[0] * pPixelClone1->red + _matrix[1] * pPixelClone2->red + _matrix[2] * pPixelClone3->red
                                + _matrix[3] * pPixelClone4->red + _matrix[4] * pPixelClone5->red + _matrix[5] * pPixelClone6->red
                                + _matrix[6] * pPixelClone7->red + _matrix[7] * pPixelClone8->red + _matrix[8] * pPixelClone9->red) / Weight;

            pPixel->red = (byte)((tmp >= 0) ? ((tmp <= 255) ? tmp : 255) : 0);

            tmp = Offset + (_matrix[0] * pPixelClone1->green + _matrix[1] * pPixelClone2->green + _matrix[2] * pPixelClone3->green
                            + _matrix[3] * pPixelClone4->green + _matrix[4] * pPixelClone5->green + _matrix[5] * pPixelClone6->green
                            + _matrix[6] * pPixelClone7->green + _matrix[7] * pPixelClone8->green + _matrix[8] * pPixelClone9->green) / Weight;

            pPixel->green = (byte)((tmp >= 0) ? ((tmp <= 255) ? tmp : 255) : 0);

            tmp = Offset + (_matrix[0] * pPixelClone1->blue + _matrix[1] * pPixelClone2->blue + _matrix[2] * pPixelClone3->blue
                            + _matrix[3] * pPixelClone4->blue + _matrix[4] * pPixelClone5->blue + _matrix[5] * pPixelClone6->blue
                            + _matrix[6] * pPixelClone7->blue + _matrix[7] * pPixelClone8->blue + _matrix[8] * pPixelClone9->blue) / Weight;

            pPixel->blue = (byte)((tmp >= 0) ? ((tmp <= 255) ? tmp : 255) : 0);
        }
Esempio n. 4
0
        public unsafe override void Filter(int x, int y, PixelGet getPixel, PixelData *pPixel, int x0, int y0, int x1, int y1)
        {
            var ratio      = this.Threshold / 100.0;
            var grayscaled = 0.299 * pPixel->red + 0.587 * pPixel->green + 0.114 * pPixel->blue;
            var max_diff   = 0.0;
            var max_temp   = 0.0;

            var pPixels = new[]
            {
                getPixel(x - 1, y + 1),
                getPixel(x, y + 1),
                getPixel(x + 1, y + 1),
                getPixel(x - 1, y),
                getPixel(x + 1, y),
                getPixel(x - 1, y - 1),
                getPixel(x, y - 1),
                getPixel(x + 1, y - 1)
            };

            foreach (PixelData *pCurrent in pPixels)
            {
                max_temp = Math.Abs((0.299 * pCurrent->red + 0.587 * pCurrent->green + 0.114 * pCurrent->blue) - grayscaled);
                if (max_temp > max_diff)
                {
                    max_diff = max_temp;
                }
            }
            var mask = 1.0 / (max_diff / Math.Sqrt(grayscaled + 1.0) / 3.0 + 1.0);

            pPixel->red = pPixel->green = pPixel->blue = (byte)(grayscaled + ratio * ((255 - grayscaled) * mask - max_diff * grayscaled / 100.0));
        }
Esempio n. 5
0
        public unsafe override void Filter(int x, int y, PixelGet getPixel, PixelData *pPixel, int x0, int y0, int x1, int y1)
        {
            PixelData *localPixel  = pPixel;
            PixelData *localPixel1 = getPixel(x + 1, y);
            PixelData *localPixel2 = getPixel(x, y + 1);

            if (((localPixel->red - localPixel1->red) * (localPixel->red - localPixel1->red)) +
                ((localPixel->green - localPixel1->green) * (localPixel->green - localPixel1->green)) +
                ((localPixel->blue - localPixel1->blue) * (localPixel->blue - localPixel1->blue)) >= (this.Threshold * this.Threshold)
                ||

                ((localPixel->red - localPixel2->red) * (localPixel->red - localPixel2->red)) +
                ((localPixel->green - localPixel2->green) * (localPixel->green - localPixel2->green)) +
                ((localPixel->blue - localPixel2->blue) * (localPixel->blue - localPixel2->blue)) >= (this.Threshold * this.Threshold))
            {
                pPixel->red   = (byte)0;
                pPixel->green = (byte)0;
                pPixel->blue  = (byte)0;
            }
            else
            {
                pPixel->red   = (byte)255;
                pPixel->green = (byte)255;
                pPixel->blue  = (byte)255;
            }
        }
Esempio n. 6
0
        public unsafe override void Filter(int x, int y, PixelGet getPixel, PixelData *pPixel, int x0, int y0, int x1, int y1)
        {
            double mask;
            int    max_diff, max_temp;
            var    ratio = this.Threshold / 100.0;

            var pPixels = new[]
            {
                getPixel(x - 1, y + 1),
                getPixel(x, y + 1),
                getPixel(x + 1, y + 1),
                getPixel(x - 1, y),
                getPixel(x + 1, y),
                getPixel(x - 1, y - 1),
                getPixel(x, y - 1),
                getPixel(x + 1, y - 1)
            };

            ///Red
            max_diff = 0;
            foreach (var pCurrent in pPixels)
            {
                max_temp = Math.Abs(pCurrent->red - pPixel->red);
                if (max_temp > max_diff)
                {
                    max_diff = max_temp;
                }
            }
            mask         = 1.0 / (max_diff / Math.Sqrt(pPixel->red + 1.0) / 3.0 + 1.0);
            pPixel->red += (byte)(ratio * ((255 - pPixel->red) * mask - max_diff * pPixel->red / 100.0));

            ///Green
            max_diff = 0;
            foreach (var pCurrent in pPixels)
            {
                max_temp = Math.Abs(pCurrent->green - pPixel->green);
                if (max_temp > max_diff)
                {
                    max_diff = max_temp;
                }
            }
            mask           = 1.0 / (max_diff / Math.Sqrt(pPixel->green + 1.0) / 3.0 + 1.0);
            pPixel->green += (byte)(ratio * ((255 - pPixel->green) * mask - max_diff * pPixel->green / 100.0));

            ///Blue
            max_diff = 0;
            foreach (var pCurrent in pPixels)
            {
                max_temp = Math.Abs(pCurrent->blue - pPixel->blue);
                if (max_temp > max_diff)
                {
                    max_diff = max_temp;
                }
            }
            mask          = 1.0 / (max_diff / Math.Sqrt(pPixel->blue + 1.0) / 3.0 + 1.0);
            pPixel->blue += (byte)(ratio * ((255 - pPixel->blue) * mask - max_diff * pPixel->blue / 100.0));
        }
Esempio n. 7
0
        public unsafe override void Filter(int x, int y, PixelGet getPixel, PixelData *pPixel, int x0, int y0, int x1, int y1)
        {
            var pPixel1 = getPixel(x, y + 1);
            var pPixel2 = getPixel(x - 1, y);
            var pPixel3 = getPixel(x + 1, y);
            var pPixel4 = getPixel(x, y - 1);

            pPixel->red   = (byte)MathEx.Clamp((pPixel1->red + pPixel2->red + pPixel3->red + pPixel4->red + pPixel->red) / 5.0, 0, 255);
            pPixel->green = (byte)MathEx.Clamp((pPixel1->green + pPixel2->green + pPixel3->green + pPixel4->green + pPixel->green) / 5.0, 0, 255);
            pPixel->blue  = (byte)MathEx.Clamp((pPixel1->blue + pPixel2->blue + pPixel3->blue + pPixel4->blue + pPixel->blue) / 5.0, 0, 255);
        }
Esempio n. 8
0
        public unsafe override void Filter(int x, int y, PixelGet getPixel, PixelData *pPixel, int x0, int y0, int x1, int y1)
        {
            int rand_x = Math.Min(Math.Max(x0, x + _rand.Next(-this.Threshold, this.Threshold)), x1);
            int rand_y = Math.Min(Math.Max(y0, y + _rand.Next(-this.Threshold, this.Threshold)), y1);

            PixelData *pRandPixel = getPixel(rand_x, rand_y);

            pPixel->red   = pRandPixel->red;
            pPixel->green = pRandPixel->green;
            pPixel->blue  = pRandPixel->blue;
        }
Esempio n. 9
0
        public unsafe override void Filter(int x, int y, PixelGet getPixel, PixelData *pPixel, int x0, int y0, int x1, int y1)
        {
            PixelData pixel1 = new PixelData();
            PixelData pixel2 = new PixelData();

            this.Matrix = mat1;
            this.applyConvolution3x3(x, y, getPixel, &pixel1);

            this.Matrix = mat2;
            this.applyConvolution3x3(x, y, getPixel, &pixel2);

            pPixel->red   = (byte)Math.Sqrt(pixel1.red * pixel1.red + pixel2.red * pixel2.red);
            pPixel->green = (byte)Math.Sqrt(pixel1.green * pixel1.green + pixel2.green * pixel2.green);
            pPixel->blue  = (byte)Math.Sqrt(pixel1.blue * pixel1.blue + pixel2.blue * pixel2.blue);
        }
Esempio n. 10
0
        public unsafe override void Filter(int x, int y, PixelGet getPixel, PixelData *pPixel, int x0, int y0, int x1, int y1)
        {
            int rot_x = (int)((x - _center.X) * Math.Cos(_angle) - (y - _center.Y) * Math.Sin(_angle) + _center.X);
            int rot_y = (int)((x - _center.X) * Math.Sin(_angle) + (y - _center.Y) * Math.Cos(_angle) + _center.Y);

            if (rot_x >= x0 && rot_x <= x1 && rot_y >= y0 && rot_y <= y1)
            {
                PixelData *pRotPixel = getPixel(rot_x, rot_y);
                pPixel->red   = pRotPixel->red;
                pPixel->green = pRotPixel->green;
                pPixel->blue  = pRotPixel->blue;
            }
            else
            {
                pPixel->red   = this.FillColor.R;
                pPixel->green = this.FillColor.G;
                pPixel->blue  = this.FillColor.B;
            }
        }
Esempio n. 11
0
        public unsafe override void Filter(int x, int y, PixelGet getPixel, PixelData *pPixel, int x0, int y0, int x1, int y1)
        {
            var pixels = new PixelData *[this.Threshold * this.Threshold];

            int f1 = (int)(0.5 * (this.Threshold - 1));

            for (int i = 0; i < this.Threshold; i++)
            {
                for (int j = 0; j < this.Threshold; j++)
                {
                    int xi = x - f1 + i;
                    int yi = y - f1 + j;
                    pixels[i * this.Threshold + j] = getPixel((xi < 0) ? 0 : ((xi > x1) ? x1 : xi),
                                                              (yi < 0) ? 0 : ((yi > y1) ? y1 : yi));
                }
            }

            int index = MostFrequent(pixels);

            pPixel->red   = pixels[index]->red;
            pPixel->green = pixels[index]->green;
            pPixel->blue  = pixels[index]->blue;
        }
Esempio n. 12
0
 /// <summary>
 /// Buffered filter
 /// </summary>
 public unsafe virtual void Filter(int x, int y, PixelGet getPixel, PixelData *pPixel, int x0, int y0, int x1, int y1)
 {
     throw new NotImplementedException();
 }
Esempio n. 13
0
 public unsafe override void Filter(int x, int y, PixelGet getPixel, PixelData *pPixel, int x0, int y0, int x1, int y1)
 {
     this.applyConvolution3x3(x, y, getPixel, pPixel);
 }