简单图片处理

    public static class ImageProcess

    {

        /// <summary>

        /// 图片旋转

        /// </summary>

        /// <param name="image"></param>

        /// <param name="angle">旋转角度</param>

        /// <returns></returns>

        public static Image Rotation(Image image,float angle)

        {



            angle = 360 - angle % 360;            //弧度转换

            double radian = angle * Math.PI / 180.0;

            double cos = Math.Cos(radian);

            double sin = Math.Sin(radian);

            //原图的宽和高

            int w = image.Width;

            int h = image.Height;

            int W = (int)(Math.Max(Math.Abs(w * cos - h * sin), Math.Abs(w * cos + h * sin)));

            int H = (int)(Math.Max(Math.Abs(w * sin - h * cos), Math.Abs(w * sin + h * cos)));

            //目标位图

            Bitmap dsImage = new Bitmap(W, H);

            System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(dsImage);

            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.Bilinear;

            g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;

            //计算偏移量

            Point Offset = new Point((W - w) / 2, (H - h) / 2);

            //构造图像显示区域:让图像的中心与窗口的中心点一致

            Rectangle rect = new Rectangle(Offset.X, Offset.Y, w, h);

            Point center = new Point(rect.X + rect.Width / 2, rect.Y + rect.Height / 2);

            g.TranslateTransform(center.X, center.Y);

            g.RotateTransform(360 - angle);

            //恢复图像在水平和垂直方向的平移

            g.TranslateTransform(-center.X, -center.Y);

            g.DrawImage(image, rect);

            //重至绘图的所有变换

            g.ResetTransform();

            g.Save();

            g.Dispose();

            return dsImage;

        }



        /// <summary>

        /// 图片翻转

        /// </summary>

        /// <param name="image"></param>

        /// <param name="type">1水平,2垂直,3水平垂直</param>

        /// <returns></returns>

        public static Image Turn(Image image,int type)

        {

            if (type == 1)

            {

                image.RotateFlip(RotateFlipType.RotateNoneFlipX);

            }

            else if (type == 2)

            {

                image.RotateFlip(RotateFlipType.RotateNoneFlipY);

            }

            else if (type == 3)

            {

                image.RotateFlip(RotateFlipType.RotateNoneFlipXY);

            }

            return image;

        }



        /// <summary>

        /// 底片效果

        /// </summary>

        /// <param name="image"></param>

        /// <returns></returns>

        public static Image Film(Image image)

        {

            try

            {

                int height = image.Height;

                int width = image.Width;

                Bitmap newbitmap = new Bitmap(width, height);

                Bitmap oldbitmap = (Bitmap)image;

                Color pixel;

                for (int x = 1; x < width; x++)

                {

                    for (int y = 1; y < height; y++)

                    {

                        int r, g, b;

                        pixel = oldbitmap.GetPixel(x, y);

                        r = 255 - pixel.R;

                        g = 255 - pixel.G;

                        b = 255 - pixel.B;

                        newbitmap.SetPixel(x, y, Color.FromArgb(r, g, b));

                    }

                }

                return newbitmap;

            }

            catch

            {

                return null;

            }

        }



        /// <summary>

        /// 浮雕效果

        /// </summary>

        /// <param name="image"></param>

        /// <returns></returns>

        public static Image Relief(Image image)

        {

            try

            {

                int height = image.Height;

                int width = image.Width;

                Bitmap newbitmap = new Bitmap(width, height);

                Bitmap oldbitmap = (Bitmap)image;

                Color pixel1, pixel2;

                for (int x = 0; x < width - 1; x++)

                {

                    for (int y = 0; y < height - 1; y++)

                    {

                        int r, g, b;

                        pixel1 = oldbitmap.GetPixel(x, y);

                        pixel2 = oldbitmap.GetPixel(x + 1, y + 1);

                        r = Math.Abs(pixel1.R - pixel2.R + 128);

                        g = Math.Abs(pixel1.G - pixel2.G + 128);

                        b = Math.Abs(pixel1.B - pixel2.B + 128);

                        if (r > 255)

                            r = 255;

                        if (r < 0)

                            r = 0;

                        if (g > 255)

                            g = 255;

                        if (g < 0)

                            g = 0;

                        if (b > 255)

                            b = 255;

                        if (b < 0)

                            b = 0;

                        newbitmap.SetPixel(x, y, Color.FromArgb(r, g, b));

                    }

                }

                return newbitmap;

            }

            catch

            {

                return null;

            }

        }



        /// <summary>

        /// 黑白效果

        /// </summary>

        /// <param name="image"></param>

        /// <returns></returns>

        public static Image BlackAndWhite(Image image)

        {

            try

            {

                int height = image.Height;

                int width = image.Width;

                Bitmap newbitmap = new Bitmap(width, height);

                Bitmap oldbitmap = (Bitmap)image;

                Color pixel;

                for (int x = 0; x < width; x++)

                    for (int y = 0; y < height; y++)

                    {

                        pixel = oldbitmap.GetPixel(x, y);

                        int r, g, b, Result = 0;

                        r = pixel.R;

                        g = pixel.G;

                        b = pixel.B;

                        //实例程序以加权平均值法产生黑白图像

                        int iType = 2;

                        switch (iType)

                        {

                            case 0://平均值法

                                Result = ((r + g + b) / 3);

                                break;

                            case 1://最大值法

                                Result = r > g ? r : g;

                                Result = Result > b ? Result : b;

                                break;

                            case 2://加权平均值法

                                Result = ((int)(0.7 * r) + (int)(0.2 * g) + (int)(0.1 * b));

                                break;

                        }

                        newbitmap.SetPixel(x, y, Color.FromArgb(Result, Result, Result));

                    }

                return newbitmap;

            }

            catch

            {

                return null;

            }

        }



        /// <summary>

        /// 柔化效果

        /// </summary>

        /// <param name="image"></param>

        /// <returns></returns>

        public static Image Soften(Image image)

        {

            try

            {

                int height = image.Height;

                int width = image.Width;

                Bitmap newbitmap = new Bitmap(width, height);

                Bitmap oldbitmap = (Bitmap)image;

                Color pixel;

                //高斯模板

                int[] Gauss = { 1, 2, 1, 2, 4, 2, 1, 2, 1 };

                for (int x = 1; x < width - 1; x++)

                {

                    for (int y = 1; y < height - 1; y++)

                    {

                        int r = 0, g = 0, b = 0;

                        int Index = 0;

                        for (int col = -1; col <= 1; col++)

                            for (int row = -1; row <= 1; row++)

                            {

                                pixel = oldbitmap.GetPixel(x + row, y + col);

                                r += pixel.R * Gauss[Index];

                                g += pixel.G * Gauss[Index];

                                b += pixel.B * Gauss[Index];

                                Index++;

                            }

                        r /= 16;

                        g /= 16;

                        b /= 16;

                        //处理颜色值溢出

                        r = r > 255 ? 255 : r;

                        r = r < 0 ? 0 : r;

                        g = g > 255 ? 255 : g;

                        g = g < 0 ? 0 : g;

                        b = b > 255 ? 255 : b;

                        b = b < 0 ? 0 : b;

                        newbitmap.SetPixel(x - 1, y - 1, Color.FromArgb(r, g, b));

                    }

                }

                return newbitmap;

            }

            catch

            {

                return null;

            }

        }



        /// <summary>

        /// 锐化效果

        /// </summary>

        /// <param name="image"></param>

        /// <returns></returns>

        public static Image Sharpen(Image image)

        {

            try

            {

                int height = image.Height;

                int width = image.Width;

                Bitmap newbitmap = new Bitmap(width, height);

                Bitmap oldbitmap = (Bitmap)image;

                Color pixel;

                //拉普拉斯模板

                int[] Laplacian = { -1, -1, -1, -1, 9, -1, -1, -1, -1 };

                for (int x = 1; x < width - 1; x++)

                {

                    for (int y = 1; y < height - 1; y++)

                    {

                        int r = 0, g = 0, b = 0;

                        int Index = 0;

                        for (int col = -1; col <= 1; col++)

                            for (int row = -1; row <= 1; row++)

                            {

                                pixel = oldbitmap.GetPixel(x + row, y + col); r += pixel.R * Laplacian[Index];

                                g += pixel.G * Laplacian[Index];

                                b += pixel.B * Laplacian[Index];

                                Index++;

                            }

                        //处理颜色值溢出

                        r = r > 255 ? 255 : r;

                        r = r < 0 ? 0 : r;

                        g = g > 255 ? 255 : g;

                        g = g < 0 ? 0 : g;

                        b = b > 255 ? 255 : b;

                        b = b < 0 ? 0 : b;

                        newbitmap.SetPixel(x - 1, y - 1, Color.FromArgb(r, g, b));

                    }

                }

                return newbitmap;

            }

            catch

            {

                return null;

            }

        }



        /// <summary>

        /// 雾化效果

        /// </summary>

        /// <param name="image"></param>

        /// <returns></returns>

        public static Image Atomization(Image image)

        {

            try

            {

                int height = image.Height;

                int width = image.Width;

                Bitmap newbitmap = new Bitmap(width, height);

                Bitmap oldbitmap = (Bitmap)image;

                Color pixel;

                for (int x = 1; x < width - 1; x++)

                {

                    for (int y = 1; y < height - 1; y++)

                    {

                        System.Random MyRandom = new Random();

                        int k = MyRandom.Next(123456);

                        //像素块大小

                        int dx = x + k % 9;

                        int dy = y + k % 9;

                        if (dx >= width)

                            dx = width - 1;

                        if (dy >= height)

                            dy = height - 1;

                        pixel = oldbitmap.GetPixel(dx, dy);

                        newbitmap.SetPixel(x, y, pixel);

                    }

                }

                return newbitmap;

            }

            catch

            {

                return null;

            }

        }



        /// <summary>

        /// 图片明暗调整

        /// </summary>

        /// <param name="image"></param>

        /// <param name="degree">亮度[-255,255]</param>

        /// <returns></returns>

        public static Image Brightness(Image image, int degree)

        {

            try

            {

                Bitmap b = (Bitmap)image;

                if (degree < -255) degree = -255;

                if (degree > 255) degree = 255;

                int width = image.Width;

                int height = image.Height;

                int pix = 0;



                BitmapData data = b.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);



                unsafe

                {

                    byte* p = (byte*)data.Scan0;

                    int offset = data.Stride - width * 3;

                    for (int y = 0; y < height; y++)

                    {

                        for (int x = 0; x < width; x++)

                        {

                            // 处理指定位置像素的亮度

                            for (int i = 0; i < 3; i++)

                            {

                                pix = p[i] + degree;



                                if (degree < 0) p[i] = (byte)Math.Max(0, pix);

                                if (degree > 0) p[i] = (byte)Math.Min(255, pix);



                            } // i

                            p += 3;

                        } // x

                        p += offset;

                    } // y

                }



                b.UnlockBits(data);



                return image;

            }

            catch

            {

                return null;

            }

        }



        /// <summary>

        /// 灰色效果

        /// </summary>

        /// <param name="image"></param>

        /// <returns></returns>

        public static Image Gray(Image image)

        {

            try

            {

                Bitmap currentBitmap = (Bitmap)image.Clone();

                Graphics g = Graphics.FromImage(currentBitmap);

                ImageAttributes ia = new ImageAttributes();

                float[][] colorMatrix =   {    

                new   float[]   {0.299f,   0.299f,   0.299f,   0,   0},

                new   float[]   {0.587f,   0.587f,   0.587f,   0,   0},

                new   float[]   {0.114f,   0.114f,   0.114f,   0,   0},

                new   float[]   {0,   0,   0,   1,   0},

                new   float[]   {0,   0,   0,   0,   1}

                                          };

                ColorMatrix cm = new ColorMatrix(colorMatrix);

                ia.SetColorMatrix(cm, ColorMatrixFlag.Default, ColorAdjustType.Bitmap);

                g.DrawImage(currentBitmap, new Rectangle(0, 0, currentBitmap.Width, currentBitmap.Height), 0, 0, currentBitmap.Width, currentBitmap.Height, GraphicsUnit.Pixel, ia);

                g.Dispose();

                return (Image)(currentBitmap.Clone());

            }

            catch

            {

                return null;

            }

            

        }



        /// <summary>

        /// 图像对比度调整

        /// </summary>

        /// <param name="b">原始图</param>

        /// <param name="degree">对比度[-100, 100]</param>

        /// <returns></returns>

        public static Bitmap KiContrast(Bitmap b, int degree)

        {

            if (b == null)

            {

                return null;

            }



            if (degree < -100) degree = -100;

            if (degree > 100) degree = 100;



            try

            {



                double pixel = 0;

                double contrast = (100.0 + degree) / 100.0;

                contrast *= contrast;

                int width = b.Width;

                int height = b.Height;

                BitmapData data = b.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

                unsafe

                {

                    byte* p = (byte*)data.Scan0;

                    int offset = data.Stride - width * 3;

                    for (int y = 0; y < height; y++)

                    {

                        for (int x = 0; x < width; x++)

                        {

                            // 处理指定位置像素的对比度

                            for (int i = 0; i < 3; i++)

                            {

                                pixel = ((p[i] / 255.0 - 0.5) * contrast + 0.5) * 255;

                                if (pixel < 0) pixel = 0;

                                if (pixel > 255) pixel = 255;

                                p[i] = (byte)pixel;

                            } // i

                            p += 3;

                        } // x

                        p += offset;

                    } // y

                }

                b.UnlockBits(data);

                return b;

            }

            catch

            {

                return null;

            }

        } 

    }

  

你可能感兴趣的:(图片处理)