// 双三次插值 private ImageIO BiCubicInterpolationCore() { ImageIO processed = new ImageIO(null, this.InterpolationParameter.TargetWidth, this.InterpolationParameter.TargetHeight); processed.LockBits(); double widthFactor = Convert.ToDouble(this.ImageParameter.SourceImage.Width - 1) / Convert.ToDouble(this.InterpolationParameter.TargetWidth - 1); double heightFactor = Convert.ToDouble(this.ImageParameter.SourceImage.Height - 1) / Convert.ToDouble(this.InterpolationParameter.TargetHeight - 1); //并行计算 Info infoBox = new Info(); infoBox.Show(); Parallel.For(0, this.InterpolationParameter.TargetHeight, y => { Parallel.For(0, this.InterpolationParameter.TargetWidth, x => { Poseition transformPoseition = this.TransformFunction(Convert.ToDouble(x) * widthFactor, Convert.ToDouble(y) * heightFactor); Poseition interpolatePosition = new Poseition(transformPoseition.X - 0.5, transformPoseition.Y - 0.5); if (transformPoseition.X < 0 || transformPoseition.X > (this.ImageParameter.SourceImage.Width - 1) || transformPoseition.Y < 0 || transformPoseition.Y > (this.ImageParameter.SourceImage.Height - 1)) { if (this.Stretch) { double[] source_pixels_weight_sum = { 0, 0, 0 }; byte[] rgb = { 0, 0, 0 }; Parallel.For(0, 4, y_index => { Parallel.For(0, 4, x_index => { Poseition dPosition = new Poseition(-interpolatePosition.X + Convert.ToInt32(interpolatePosition.X) + x_index - 1, -interpolatePosition.Y + Convert.ToInt32(interpolatePosition.Y) + y_index - 1); Poseition positionWeight = new Poseition(BiCubicWeight(dPosition.X, this.InterpolationParameter.BicubicFactor), BiCubicWeight(dPosition.Y, this.InterpolationParameter.BicubicFactor)); Poseition indexPosition = new Poseition(Math.Max(0, Math.Min(this.ImageParameter.SourceImage.Width - 1, Convert.ToInt32(interpolatePosition.X) + x_index - 1)), Math.Max(0, Math.Min(this.ImageParameter.SourceImage.Height - 1, Convert.ToInt32(interpolatePosition.Y) + y_index - 1))); source_pixels_weight_sum[0] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(indexPosition.X), Convert.ToInt32(indexPosition.Y)).R) * positionWeight.X * positionWeight.Y; source_pixels_weight_sum[1] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(indexPosition.X), Convert.ToInt32(indexPosition.Y)).G) * positionWeight.X * positionWeight.Y; source_pixels_weight_sum[2] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(indexPosition.X), Convert.ToInt32(indexPosition.Y)).B) * positionWeight.X * positionWeight.Y; }); }); for (int i = 0; i < 3; i++) { rgb[i] = Convert.ToByte(Math.Max(0, Math.Min(255, source_pixels_weight_sum[i]))); } System.Drawing.Color rgb_color = System.Drawing.Color.FromArgb(rgb[0], rgb[1], rgb[2]); processed.SetPixel(x, y, rgb_color); } else { System.Drawing.Color rgb = System.Drawing.Color.FromArgb(0, 0, 0); processed.SetPixel(x, y, rgb); } } else { double[] source_pixels_weight_sum = { 0, 0, 0 }; byte[] rgb = { 0, 0, 0 }; Parallel.For(0, 4, y_index => { Parallel.For(0, 4, x_index => { Poseition dPosition = new Poseition(-interpolatePosition.X + Convert.ToInt32(interpolatePosition.X) + x_index - 1, -interpolatePosition.Y + Convert.ToInt32(interpolatePosition.Y) + y_index - 1); Poseition positionWeight = new Poseition(BiCubicWeight(dPosition.X, this.InterpolationParameter.BicubicFactor), BiCubicWeight(dPosition.Y, this.InterpolationParameter.BicubicFactor)); Poseition indexPosition = new Poseition(Math.Max(0, Math.Min(this.ImageParameter.SourceImage.Width - 1, Convert.ToInt32(interpolatePosition.X) + x_index - 1)), Math.Max(0, Math.Min(this.ImageParameter.SourceImage.Height - 1, Convert.ToInt32(interpolatePosition.Y) + y_index - 1))); source_pixels_weight_sum[0] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(indexPosition.X), Convert.ToInt32(indexPosition.Y)).R) * positionWeight.X * positionWeight.Y; source_pixels_weight_sum[1] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(indexPosition.X), Convert.ToInt32(indexPosition.Y)).G) * positionWeight.X * positionWeight.Y; source_pixels_weight_sum[2] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(indexPosition.X), Convert.ToInt32(indexPosition.Y)).B) * positionWeight.X * positionWeight.Y; }); }); for (int i = 0; i < 3; i++) { rgb[i] = Convert.ToByte(Math.Max(0, Math.Min(255, source_pixels_weight_sum[i]))); } System.Drawing.Color rgb_color = System.Drawing.Color.FromArgb(rgb[0], rgb[1], rgb[2]); processed.SetPixel(x, y, rgb_color); } }); }); infoBox.Close(); Success successBox = new Success(); successBox.ShowDialog(); processed.UnlockBits(); return(processed); }
// 双线性插值 private ImageIO BiIinearInterpolationCore() { ImageIO processed = new ImageIO(null, this.InterpolationParameter.TargetWidth, this.InterpolationParameter.TargetHeight); processed.LockBits(); double widthFactor = Convert.ToDouble(this.ImageParameter.SourceImage.Width - 1) / Convert.ToDouble(this.InterpolationParameter.TargetWidth - 1); double heightFactor = Convert.ToDouble(this.ImageParameter.SourceImage.Height - 1) / Convert.ToDouble(this.InterpolationParameter.TargetHeight - 1); //并行计算 Info infoBox = new Info(); infoBox.Show(); Parallel.For(0, this.InterpolationParameter.TargetHeight, y => { Parallel.For(0, this.InterpolationParameter.TargetWidth, x => { Poseition transformPoseition = this.TransformFunction(Convert.ToDouble(x) * widthFactor, Convert.ToDouble(y) * heightFactor); Poseition interpolatePosition = new Poseition(transformPoseition.X, transformPoseition.Y); Poseition interpolatePositionFloor = new Poseition(Math.Floor(transformPoseition.X), Math.Floor(transformPoseition.Y)); Poseition interpolatePosition11 = new Poseition(Math.Max(0, Math.Min(this.InterpolationParameter.TargetWidth - 1, interpolatePositionFloor.X)), Math.Max(0, Math.Min(this.InterpolationParameter.TargetHeight - 1, interpolatePositionFloor.Y))); Poseition interpolatePosition12 = new Poseition(Math.Max(0, Math.Min(this.InterpolationParameter.TargetWidth - 1, interpolatePositionFloor.X)), Math.Max(0, Math.Min(this.InterpolationParameter.TargetHeight - 1, interpolatePositionFloor.Y + 1))); Poseition interpolatePosition21 = new Poseition(Math.Max(0, Math.Min(this.InterpolationParameter.TargetWidth - 1, interpolatePositionFloor.X + 1)), Math.Max(0, Math.Min(this.InterpolationParameter.TargetHeight - 1, interpolatePositionFloor.Y))); Poseition interpolatePosition22 = new Poseition(Math.Max(0, Math.Min(this.InterpolationParameter.TargetWidth - 1, interpolatePositionFloor.X + 1)), Math.Max(0, Math.Min(this.InterpolationParameter.TargetHeight - 1, interpolatePositionFloor.Y + 1))); if (transformPoseition.X <= 0 || transformPoseition.X >= (this.ImageParameter.SourceImage.Width - 1) || transformPoseition.Y <= 0 || transformPoseition.Y >= (this.ImageParameter.SourceImage.Height - 1)) { if (this.Stretch) { Poseition newPoseition = new Poseition(Math.Max(0, Math.Min(this.ImageParameter.SourceImage.Width - 1, transformPoseition.X)), Math.Max(0, Math.Min(this.ImageParameter.SourceImage.Height - 1, transformPoseition.Y))); System.Drawing.Color rgb = this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(newPoseition.X), Convert.ToInt32(newPoseition.Y)); processed.SetPixel(x, y, rgb); } else { System.Drawing.Color rgb = System.Drawing.Color.FromArgb(0, 0, 0); processed.SetPixel(x, y, rgb); } } else { double[] source_pixels_weight_sum = { 0, 0, 0 }; byte[] rgb = { 0, 0, 0 }; source_pixels_weight_sum[0] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(interpolatePosition11.X), Convert.ToInt32(interpolatePosition11.Y)).R) * (interpolatePosition22.X - interpolatePosition.X) * (interpolatePosition22.Y - interpolatePosition.Y); source_pixels_weight_sum[0] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(interpolatePosition12.X), Convert.ToInt32(interpolatePosition12.Y)).R) * (interpolatePosition22.X - interpolatePosition.X) * (interpolatePosition.Y - interpolatePosition11.Y); source_pixels_weight_sum[0] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(interpolatePosition21.X), Convert.ToInt32(interpolatePosition21.Y)).R) * (interpolatePosition.X - interpolatePosition11.X) * (interpolatePosition22.Y - interpolatePosition.Y); source_pixels_weight_sum[0] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(interpolatePosition22.X), Convert.ToInt32(interpolatePosition22.Y)).R) * (interpolatePosition.X - interpolatePosition11.X) * (interpolatePosition.Y - interpolatePosition11.Y); source_pixels_weight_sum[1] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(interpolatePosition11.X), Convert.ToInt32(interpolatePosition11.Y)).G) * (interpolatePosition22.X - interpolatePosition.X) * (interpolatePosition22.Y - interpolatePosition.Y); source_pixels_weight_sum[1] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(interpolatePosition12.X), Convert.ToInt32(interpolatePosition12.Y)).G) * (interpolatePosition22.X - interpolatePosition.X) * (interpolatePosition.Y - interpolatePosition11.Y); source_pixels_weight_sum[1] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(interpolatePosition21.X), Convert.ToInt32(interpolatePosition21.Y)).G) * (interpolatePosition.X - interpolatePosition11.X) * (interpolatePosition22.Y - interpolatePosition.Y); source_pixels_weight_sum[1] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(interpolatePosition22.X), Convert.ToInt32(interpolatePosition22.Y)).G) * (interpolatePosition.X - interpolatePosition11.X) * (interpolatePosition.Y - interpolatePosition11.Y); source_pixels_weight_sum[2] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(interpolatePosition11.X), Convert.ToInt32(interpolatePosition11.Y)).B) * (interpolatePosition22.X - interpolatePosition.X) * (interpolatePosition22.Y - interpolatePosition.Y); source_pixels_weight_sum[2] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(interpolatePosition12.X), Convert.ToInt32(interpolatePosition12.Y)).B) * (interpolatePosition22.X - interpolatePosition.X) * (interpolatePosition.Y - interpolatePosition11.Y); source_pixels_weight_sum[2] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(interpolatePosition21.X), Convert.ToInt32(interpolatePosition21.Y)).B) * (interpolatePosition.X - interpolatePosition11.X) * (interpolatePosition22.Y - interpolatePosition.Y); source_pixels_weight_sum[2] += Convert.ToDouble(this.ImageParameter.SourceImage.GetPixel(Convert.ToInt32(interpolatePosition22.X), Convert.ToInt32(interpolatePosition22.Y)).B) * (interpolatePosition.X - interpolatePosition11.X) * (interpolatePosition.Y - interpolatePosition11.Y); for (int i = 0; i < 3; i++) { rgb[i] = Convert.ToByte(Math.Max(0, Math.Min(255, source_pixels_weight_sum[i]))); } System.Drawing.Color rgb_color = System.Drawing.Color.FromArgb(rgb[0], rgb[1], rgb[2]); processed.SetPixel(x, y, rgb_color); } }); }); infoBox.Close(); Success successBox = new Success(); successBox.ShowDialog(); processed.UnlockBits(); return(processed); }