예제 #1
0
 public override void calc(double b1, double b2, double b3, double b4,
                           RecursizeBlurCalculator c1, RecursizeBlurCalculator c2, RecursizeBlurCalculator c3, RecursizeBlurCalculator c4)
 {
     r = b1 * c1.r + b2 * c2.r + b3 * c3.r + b4 * c4.r;
     g = b1 * c1.g + b2 * c2.g + b3 * c3.g + b4 * c4.g;
     b = b1 * c1.b + b2 * c2.b + b3 * c3.b + b4 * c4.b;
 }
예제 #2
0
 public RecursiveBlur(RecursizeBlurCalculator recursizeBluerCalculatorFactory)
 {
     m_sum1 = new List <RecursizeBlurCalculator>();
     m_sum2 = new List <RecursizeBlurCalculator>();
     m_buf  = new VectorPOD <Color>();
     m_RecursizeBlurCalculatorFactory = recursizeBluerCalculatorFactory;
 }
예제 #3
0
        public void blur_x(IImageByte img, double radius)
        {
            if (radius < 0.62)
            {
                return;
            }
            if (img.Width < 3)
            {
                return;
            }

            double s = (double)(radius * 0.5);
            double q = (double)((s < 2.5) ?
                                3.97156 - 4.14554 * Math.Sqrt(1 - 0.26891 * s) :
                                0.98711 * s - 0.96330);

            double q2 = (double)(q * q);
            double q3 = (double)(q2 * q);

            double b0 = (double)(1.0 / (1.578250 +
                                        2.444130 * q +
                                        1.428100 * q2 +
                                        0.422205 * q3));

            double b1 = (double)(2.44413 * q +
                                 2.85619 * q2 +
                                 1.26661 * q3);

            double b2 = (double)(-1.42810 * q2 +
                                 -1.26661 * q3);

            double b3 = (double)(0.422205 * q3);

            double b = (double)(1 - (b1 + b2 + b3) * b0);

            b1 *= b0;
            b2 *= b0;
            b3 *= b0;

            int w = img.Width;
            int h = img.Height;
            int wm = (int)w - 1;
            int x, y;

            int StartCreatingAt = (int)m_sum1.Count;

            for (int i = StartCreatingAt; i < w; i++)
            {
                m_sum1.Add(null);
                m_sum2.Add(null);
            }
            m_buf.Allocate(w);

            List <RecursizeBlurCalculator> Sum1Array = m_sum1;
            List <RecursizeBlurCalculator> Sum2Array = m_sum2;

            Color[] BufferArray = m_buf.Array;

            for (int i = StartCreatingAt; i < w; i++)
            {
                Sum1Array[i] = m_RecursizeBlurCalculatorFactory.CreateNew();
                Sum2Array[i] = m_RecursizeBlurCalculatorFactory.CreateNew();
            }

            for (y = 0; y < h; y++)
            {
                RecursizeBlurCalculator c = m_RecursizeBlurCalculatorFactory;
                c.from_pix(img.GetPixel(0, y));
                Sum1Array[0].calc(b, b1, b2, b3, c, c, c, c);
                c.from_pix(img.GetPixel(1, y));
                Sum1Array[1].calc(b, b1, b2, b3, c, Sum1Array[0], Sum1Array[0], Sum1Array[0]);
                c.from_pix(img.GetPixel(2, y));
                Sum1Array[2].calc(b, b1, b2, b3, c, Sum1Array[1], Sum1Array[0], Sum1Array[0]);

                for (x = 3; x < w; ++x)
                {
                    c.from_pix(img.GetPixel(x, y));
                    Sum1Array[x].calc(b, b1, b2, b3, c, Sum1Array[x - 1], Sum1Array[x - 2], Sum1Array[x - 3]);
                }

                Sum2Array[wm].calc(b, b1, b2, b3, Sum1Array[wm], Sum1Array[wm], Sum1Array[wm], Sum1Array[wm]);
                Sum2Array[wm - 1].calc(b, b1, b2, b3, Sum1Array[wm - 1], Sum2Array[wm], Sum2Array[wm], Sum2Array[wm]);
                Sum2Array[wm - 2].calc(b, b1, b2, b3, Sum1Array[wm - 2], Sum2Array[wm - 1], Sum2Array[wm], Sum2Array[wm]);
                Sum2Array[wm].to_pix(ref BufferArray[wm]);
                Sum2Array[wm - 1].to_pix(ref BufferArray[wm - 1]);
                Sum2Array[wm - 2].to_pix(ref BufferArray[wm - 2]);

                for (x = wm - 3; x >= 0; --x)
                {
                    Sum2Array[x].calc(b, b1, b2, b3, Sum1Array[x], Sum2Array[x + 1], Sum2Array[x + 2], Sum2Array[x + 3]);
                    Sum2Array[x].to_pix(ref BufferArray[x]);
                }

                img.copy_color_hspan(0, y, w, BufferArray, 0);
            }
        }
예제 #4
0
 public abstract void calc(double b1, double b2, double b3, double b4,
                           RecursizeBlurCalculator c1, RecursizeBlurCalculator c2, RecursizeBlurCalculator c3, RecursizeBlurCalculator c4);
예제 #5
0
		public override void calc(double b1, double b2, double b3, double b4,
			RecursizeBlurCalculator c1, RecursizeBlurCalculator c2, RecursizeBlurCalculator c3, RecursizeBlurCalculator c4)
		{
			r = b1 * c1.r + b2 * c2.r + b3 * c3.r + b4 * c4.r;
		}
예제 #6
0
		public override void calc(double b1, double b2, double b3, double b4,
			RecursizeBlurCalculator c1, RecursizeBlurCalculator c2, RecursizeBlurCalculator c3, RecursizeBlurCalculator c4)
		{
			r = b1 * c1.r + b2 * c2.r + b3 * c3.r + b4 * c4.r;
			g = b1 * c1.g + b2 * c2.g + b3 * c3.g + b4 * c4.g;
			b = b1 * c1.b + b2 * c2.b + b3 * c3.b + b4 * c4.b;
			a = b1 * c1.a + b2 * c2.a + b3 * c3.a + b4 * c4.a;
		}
예제 #7
0
		public RecursiveBlur(RecursizeBlurCalculator recursizeBluerCalculatorFactory)
		{
			m_sum1 = new List<RecursizeBlurCalculator>();
			m_sum2 = new List<RecursizeBlurCalculator>();
			m_buf = new VectorPOD<RGBA_Bytes>();
			m_RecursizeBlurCalculatorFactory = recursizeBluerCalculatorFactory;
		}
예제 #8
0
		public abstract void calc(double b1, double b2, double b3, double b4,
			RecursizeBlurCalculator c1, RecursizeBlurCalculator c2, RecursizeBlurCalculator c3, RecursizeBlurCalculator c4);