示例#1
0
 public image_trans()
 {
     im = null;
     new_image = null;
     im_path = null;
     origin_image = null;
     usr_interpolation = 3;
 }
示例#2
0
 public void image_output()
 {
     GC.Collect();               //强制释放内存
     if (im == null)
         return;
     origin_image = new image_show(im, true);
     origin_image.Show();
 }
示例#3
0
        private void kernel(int new_width, int new_height, int inter_func, bool Isrotate, float bonus0, float bonus1 = 1)
        {
            double x, y;

            BitmapData data = new_image.LockBits(new Rectangle(0, 0, new_width, new_height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            BitmapData data0 = im.LockBits(new Rectangle(0, 0, im.Width, im.Height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
            int width = data.Width;
            int height = data.Height;
            int x_offset = (height - 1) / 2;
            int y_offset = (width - 1) / 2;
            int origin_width = data0.Width;
            int origin_height = data0.Height;
            int origin_x_off = (origin_height - 1) / 2;
            int origin_y_off = (origin_width - 1) / 2;
            unsafe
            {
                byte* ptr = (byte*)data.Scan0;
                byte* ptr_temp = (byte*)data0.Scan0;

                for (int h = 0; h < height; h++)
                {
                    for (int w = 0; w < width; w++)
                    {
                        if (Isrotate)
                        {
                            coord_rotate_trans(h, w, bonus0, out x, out y, x_offset, y_offset, origin_x_off, origin_y_off);
                        }
                        else
                            coord_zoom_trans(h, w, out x, out y, bonus0, bonus1);
                        if (x < 0 || x >= origin_height || y < 0 || y >= origin_width)
                        {
                            ptr[0] = 0;
                            ptr[1] = 0;
                            ptr[2] = 0;
                        }
                        else
                        {
                            int _x = (int)Math.Floor(x);
                            int _y = (int)Math.Floor(y);
                            byte*[,] p;
                            p = new byte*[4, 4];
                            int x_flag = 1, y_flag = 1;
                            if (_x >= origin_height - 1)
                                x_flag = -1;
                            else
                                x_flag = 1;
                            if (_y >= origin_width - 1)
                                y_flag = -1;
                            else
                                y_flag = 1;
                            p[2, 1] = ptr_temp + data0.Stride * (_x + x_flag) + 3 * _y;
                            p[1, 1] = ptr_temp + data0.Stride * _x + 3 * _y;
                            p[1, 2] = ptr_temp + data0.Stride * _x + 3 * (_y + y_flag);
                            p[2, 2] = ptr_temp + data0.Stride * (_x + x_flag) + 3 * (_y + y_flag);

                            for (int i = 0; i < 3; i++)
                            {
                                int m1 = p[1, 1][i];
                                int m2 = p[1, 2][i];
                                int m3 = p[2, 1][i];
                                int m4 = p[2, 2][i];
                                switch (inter_func)
                                {
                                    case (int)interpolation_func.nearliest:
                                        ptr[i] = (byte)nearliest_interpolation(x, y, m1, m2, m3, m4);
                                        break;
                                    case (int)interpolation_func.bilinear:
                                        ptr[i] = (byte)bi_interpolation(x, y, m1, m2, m3, m4);
                                        break;
                                    case (int)interpolation_func.bicubic:
                                        {

                                            int y_expend, x_expend;
                                            if (_y - 1 < 0)
                                                y_expend = 3;
                                            else
                                                y_expend = Math.Min((origin_width - 1 - _y), 2);
                                            if (_x - 1 < 0)
                                                x_expend = 3;
                                            else
                                                x_expend = Math.Min((origin_height - 1 - _x), 2);
                                            double u = x - _x;
                                            double v = y - _y;
                                            double s1, s2, s3, s4, s5, s6, s7, s8;
                                            s1 = Sx(u + 3 - x_expend);
                                            s2 = Sx(u + 2 - x_expend);
                                            s3 = Sx(u + 1 - x_expend);
                                            s4 = Sx(u - x_expend);
                                            s5 = Sx(v + 3 - y_expend);
                                            s6 = Sx(v + 2 - y_expend);
                                            s7 = Sx(v + 1 - y_expend);
                                            s8 = Sx(v - y_expend);
                                            p[0, 0] = ptr_temp + data0.Stride * (_x - 4 + x_expend) + 3 * (_y - 3 + y_expend);
                                            p[1, 0] = ptr_temp + data0.Stride * (_x - 3 + x_expend) + 3 * (_y - 3 + y_expend);
                                            p[1, 1] = ptr_temp + data0.Stride * (_x - 3 + x_expend) + 3 * (_y - 2 + y_expend);
                                            p[1, 2] = ptr_temp + data0.Stride * (_x - 3 + x_expend) + 3 * (_y - 1 + y_expend);
                                            p[2, 0] = ptr_temp + data0.Stride * (_x - 2 + x_expend) + 3 * (_y - 3 + y_expend);
                                            p[2, 1] = ptr_temp + data0.Stride * (_x - 2 + x_expend) + 3 * (_y - 2 + y_expend);
                                            p[2, 2] = ptr_temp + data0.Stride * (_x - 2 + x_expend) + 3 * (_y - 1 + y_expend);
                                            p[3, 0] = ptr_temp + data0.Stride * (_x - 1 + x_expend) + 3 * (_y - 3 + y_expend);
                                            p[0, 1] = ptr_temp + data0.Stride * (_x - 4 + x_expend) + 3 * (_y - 2 + y_expend);
                                            p[0, 2] = ptr_temp + data0.Stride * (_x - 4 + x_expend) + 3 * (_y - 1 + y_expend);
                                            p[0, 3] = ptr_temp + data0.Stride * (_x - 4 + x_expend) + 3 * (_y + y_expend);
                                            p[1, 3] = ptr_temp + data0.Stride * (_x - 3 + x_expend) + 3 * (_y + y_expend);
                                            p[2, 3] = ptr_temp + data0.Stride * (_x - 2 + x_expend) + 3 * (_y + y_expend);
                                            p[3, 3] = ptr_temp + data0.Stride * (_x - 1 + x_expend) + 3 * (_y + y_expend);
                                            p[3, 1] = ptr_temp + data0.Stride * (_x - 1 + x_expend) + 3 * (_y - 2 + y_expend);
                                            p[3, 2] = ptr_temp + data0.Stride * (_x - 1 + x_expend) + 3 * (_y - 1 + y_expend);
                                            double temp1 = s1 * (double)p[0, 0][i] + s2 * (double)p[1, 0][i]+ s3 * (double)p[2, 0][i]+ s4 * (double)p[3, 0][i];
                                            double temp2 = s1 * (double)p[0, 1][i] + s2 * (double)p[1, 1][i]+ s3 * (double)p[2, 1][i]+ s4 * (double)p[3, 1][i];
                                            double temp3 = s1 * (double)p[0, 2][i] + s2 * (double)p[1, 2][i]+ s3 * (double)p[2, 2][i]+ s4 * (double)p[3, 2][i];
                                            double temp4 = s1 * (double)p[0, 3][i] + s2 * (double)p[1, 3][i]+ s3 * (double)p[2, 3][i]+ s4 * (double)p[3, 3][i];
                                            double final = temp1 * s5 + temp2 * s6 + temp3 * s7 + temp4 * s8;
                                            final = final > 255 ? 255 : final;
                                            final = final < 0 ? 0 : final;
                                            ptr[i] = (byte)final;
                                            break;
                                        }

                                }

                            }

                        }
                        ptr += 3;
                    }
                    ptr += data.Stride - data.Width * 3;
                }
            }
            new_image.UnlockBits(data);
            im.UnlockBits(data0);
            image_show trans_image = new image_show(new_image, false);
            trans_image.Show();
            GC.Collect();
        }