public void image_output() { GC.Collect(); //强制释放内存 if (im == null) return; origin_image = new image_show(im, true); origin_image.Show(); }
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(); }