Exemplo n.º 1
0
        // 最近邻插值
        private ImageIO NearestNeighborInterpolationCore()
        {
            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 * widthFactor, transformPoseition.Y * heightFactor);
                    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
                    {
                        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);
                    }
                });
            });
            infoBox.Close();
            Success successBox = new Success();

            successBox.ShowDialog();
            processed.UnlockBits();
            return(processed);
        }
Exemplo n.º 2
0
        // 双三次插值
        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);
        }
Exemplo n.º 3
0
        // 双线性插值
        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);
        }