示例#1
0
        public void Blur(GaussianBlur blur, BlurEdgeMode edgeMode, bool horz, bool vert)
        {
            if (!horz && !vert)
            {
                return;
            }
            if (horz && vert)
            {
                Blur(blur, edgeMode);
                return;
            }
            var temp = ToBitmapRam();

            using (temp.UseWrite())
                using (UseWrite())
                {
                    temp.PreMultiply();
                    if (horz)
                    {
                        blur.Horizontal(temp, this, edgeMode);
                    }
                    else
                    {
                        blur.Vertical(temp, this, edgeMode);
                    }
                    UnPreMultiply();
                }
        }
示例#2
0
        internal unsafe void Vertical(BitmapBase src, BitmapBase dest, BlurEdgeMode edgeMode)
        {
            for (int x = 0; x < src.Width; x++)
            {
                byte *colSource = src.Data + x * 4;
                byte *colResult = dest.Data + x * 4;
                for (int y = 0; y < src.Height; y++)
                {
                    int rSum = 0, gSum = 0, bSum = 0, aSum = 0;
                    for (int k = 0, ySrc = y - _kernel.Length / 2; k < _kernel.Length; k++, ySrc++)
                    {
                        int yRead = ySrc;
                        if (yRead < 0 || yRead >= src.Height)
                        {
                            switch (edgeMode)
                            {
                            case BlurEdgeMode.Transparent:
                                continue;

                            case BlurEdgeMode.Same:
                                yRead = yRead < 0 ? 0 : src.Height - 1;
                                break;

                            case BlurEdgeMode.Wrap:
                                yRead = Ut.ModPositive(yRead, src.Height);
                                break;

                            case BlurEdgeMode.Mirror:
                                if (yRead < 0)
                                {
                                    yRead = -yRead - 1;
                                }
                                yRead = yRead % (2 * src.Height);
                                if (yRead >= src.Height)
                                {
                                    yRead = 2 * src.Height - yRead - 1;
                                }
                                break;
                            }
                        }
                        yRead *= src.Stride;
                        bSum  += _kernel[k] * colSource[yRead + 0];
                        gSum  += _kernel[k] * colSource[yRead + 1];
                        rSum  += _kernel[k] * colSource[yRead + 2];
                        aSum  += _kernel[k] * colSource[yRead + 3];
                    }

                    int yWrite = y * dest.Stride;
                    colResult[yWrite + 0] = (byte)(bSum / _kernelSum);
                    colResult[yWrite + 1] = (byte)(gSum / _kernelSum);
                    colResult[yWrite + 2] = (byte)(rSum / _kernelSum);
                    colResult[yWrite + 3] = (byte)(aSum / _kernelSum);
                }
            }
        }
示例#3
0
        internal unsafe void Horizontal(BitmapBase src, BitmapBase dest, BlurEdgeMode edgeMode)
        {
            for (int y = 0; y < src.Height; y++)
            {
                byte *rowSource = src.Data + y * src.Stride;
                byte *rowResult = dest.Data + y * dest.Stride;
                for (int x = 0; x < src.Width; x++)
                {
                    int rSum = 0, gSum = 0, bSum = 0, aSum = 0;
                    for (int k = 0, xSrc = x - _kernel.Length / 2; k < _kernel.Length; k++, xSrc++)
                    {
                        int xRead = xSrc;
                        if (xRead < 0 || xRead >= src.Width)
                        {
                            switch (edgeMode)
                            {
                            case BlurEdgeMode.Transparent:
                                continue;

                            case BlurEdgeMode.Same:
                                xRead = xRead < 0 ? 0 : src.Width - 1;
                                break;

                            case BlurEdgeMode.Wrap:
                                xRead = Ut.ModPositive(xRead, src.Width);
                                break;

                            case BlurEdgeMode.Mirror:
                                if (xRead < 0)
                                {
                                    xRead = -xRead - 1;
                                }
                                xRead = xRead % (2 * src.Width);
                                if (xRead >= src.Width)
                                {
                                    xRead = 2 * src.Width - xRead - 1;
                                }
                                break;
                            }
                        }
                        xRead <<= 2; // * 4
                        bSum   += _kernel[k] * rowSource[xRead + 0];
                        gSum   += _kernel[k] * rowSource[xRead + 1];
                        rSum   += _kernel[k] * rowSource[xRead + 2];
                        aSum   += _kernel[k] * rowSource[xRead + 3];
                    }

                    int xWrite = x << 2; // * 4
                    rowResult[xWrite + 0] = (byte)(bSum / _kernelSum);
                    rowResult[xWrite + 1] = (byte)(gSum / _kernelSum);
                    rowResult[xWrite + 2] = (byte)(rSum / _kernelSum);
                    rowResult[xWrite + 3] = (byte)(aSum / _kernelSum);
                }
            }
        }
示例#4
0
        public void Blur(GaussianBlur blur, BlurEdgeMode edgeMode)
        {
            var temp = new BitmapRam(Width, Height);

            using (UseWrite())
                using (temp.UseWrite())
                {
                    PreMultiply();
                    blur.Horizontal(this, temp, edgeMode);
                    blur.Vertical(temp, this, edgeMode);
                    UnPreMultiply();
                }
        }
示例#5
0
 public void Blur(GaussianBlur blur, BlurEdgeMode edgeMode)
 {
     var temp = new BitmapRam(Width, Height);
     using (UseWrite())
     using (temp.UseWrite())
     {
         PreMultiply();
         blur.Horizontal(this, temp, edgeMode);
         blur.Vertical(temp, this, edgeMode);
         UnPreMultiply();
     }
 }
示例#6
0
 public void Blur(GaussianBlur blur, BlurEdgeMode edgeMode, bool horz, bool vert)
 {
     if (!horz && !vert)
         return;
     if (horz && vert)
     {
         Blur(blur, edgeMode);
         return;
     }
     var temp = ToBitmapRam();
     using (temp.UseWrite())
     using (UseWrite())
     {
         temp.PreMultiply();
         if (horz)
             blur.Horizontal(temp, this, edgeMode);
         else
             blur.Vertical(temp, this, edgeMode);
         UnPreMultiply();
     }
 }
示例#7
0
        internal unsafe void Vertical(BitmapBase src, BitmapBase dest, BlurEdgeMode edgeMode)
        {
            for (int x = 0; x < src.Width; x++)
            {
                byte* colSource = src.Data + x * 4;
                byte* colResult = dest.Data + x * 4;
                for (int y = 0; y < src.Height; y++)
                {
                    int rSum = 0, gSum = 0, bSum = 0, aSum = 0;
                    for (int k = 0, ySrc = y - _kernel.Length / 2; k < _kernel.Length; k++, ySrc++)
                    {
                        int yRead = ySrc;
                        if (yRead < 0 || yRead >= src.Height)
                            switch (edgeMode)
                            {
                                case BlurEdgeMode.Transparent:
                                    continue;
                                case BlurEdgeMode.Same:
                                    yRead = yRead < 0 ? 0 : src.Height - 1;
                                    break;
                                case BlurEdgeMode.Wrap:
                                    yRead = Ut.ModPositive(yRead, src.Height);
                                    break;
                                case BlurEdgeMode.Mirror:
                                    if (yRead < 0)
                                        yRead = -yRead - 1;
                                    yRead = yRead % (2 * src.Height);
                                    if (yRead >= src.Height)
                                        yRead = 2 * src.Height - yRead - 1;
                                    break;
                            }
                        yRead *= src.Stride;
                        bSum += _kernel[k] * colSource[yRead + 0];
                        gSum += _kernel[k] * colSource[yRead + 1];
                        rSum += _kernel[k] * colSource[yRead + 2];
                        aSum += _kernel[k] * colSource[yRead + 3];
                    }

                    int yWrite = y * dest.Stride;
                    colResult[yWrite + 0] = (byte) (bSum / _kernelSum);
                    colResult[yWrite + 1] = (byte) (gSum / _kernelSum);
                    colResult[yWrite + 2] = (byte) (rSum / _kernelSum);
                    colResult[yWrite + 3] = (byte) (aSum / _kernelSum);
                }
            }
        }
示例#8
0
        internal unsafe void Horizontal(BitmapBase src, BitmapBase dest, BlurEdgeMode edgeMode)
        {
            for (int y = 0; y < src.Height; y++)
            {
                byte* rowSource = src.Data + y * src.Stride;
                byte* rowResult = dest.Data + y * dest.Stride;
                for (int x = 0; x < src.Width; x++)
                {
                    int rSum = 0, gSum = 0, bSum = 0, aSum = 0;
                    for (int k = 0, xSrc = x - _kernel.Length / 2; k < _kernel.Length; k++, xSrc++)
                    {
                        int xRead = xSrc;
                        if (xRead < 0 || xRead >= src.Width)
                            switch (edgeMode)
                            {
                                case BlurEdgeMode.Transparent:
                                    continue;
                                case BlurEdgeMode.Same:
                                    xRead = xRead < 0 ? 0 : src.Width - 1;
                                    break;
                                case BlurEdgeMode.Wrap:
                                    xRead = Ut.ModPositive(xRead, src.Width);
                                    break;
                                case BlurEdgeMode.Mirror:
                                    if (xRead < 0)
                                        xRead = -xRead - 1;
                                    xRead = xRead % (2 * src.Width);
                                    if (xRead >= src.Width)
                                        xRead = 2 * src.Width - xRead - 1;
                                    break;
                            }
                        xRead <<= 2; // * 4
                        bSum += _kernel[k] * rowSource[xRead + 0];
                        gSum += _kernel[k] * rowSource[xRead + 1];
                        rSum += _kernel[k] * rowSource[xRead + 2];
                        aSum += _kernel[k] * rowSource[xRead + 3];
                    }

                    int xWrite = x << 2; // * 4
                    rowResult[xWrite + 0] = (byte) (bSum / _kernelSum);
                    rowResult[xWrite + 1] = (byte) (gSum / _kernelSum);
                    rowResult[xWrite + 2] = (byte) (rSum / _kernelSum);
                    rowResult[xWrite + 3] = (byte) (aSum / _kernelSum);
                }
            }
        }
 public GaussianBlurEffect()
 {
     Edge = BlurEdgeMode.Same;
 }