对图片进行X,Y轴的翻转,黑白色转变

做完了修改图片的程序。用的Winfrom做的。昨天基本完成,记录一下使用的东西。

首先是将需要加载的图片放入picturebox控件,这里用到了openfiledialog 打开文件对话框

    string fName = string.Empty;//文件名称

1
if (openFileDialog1.ShowDialog() == DialogResult.OK) 2 { 3 fName = openFileDialog1.FileName;//记录需要加载的文件的路径 4 string picName = Path.GetFileName(fName);//根据路径,通过system.IO.Path获取路径中的文件名和扩展名 5 if (picName.Contains(".png") || picName.Contains(".jpg")) 6 { 7 Bitmap pic = new Bitmap(fName);//根据路径获取图片对象 8 this.pictureBox1.Image = pic;//将图片载入控件 9 bitlist.Add(new Bitmap(this.pictureBox1.Image));//这里是一个撤回的功能,将所有操作最后的结果图放入一个泛型集合 10 Xsfbl = scale("X"); 11 Ysfbl = scale("Y");//因为图片加载进来是按照控件大小自动改变,所以要计算一下XY坐标的比例 12 //如果图片名称写到备注 13 try 14 {//这里做了一个备注功能,保存的时候将备注作为文件名保存,加载的时候再将文件名记入备注用控件。 15 string lpath = fName.Substring(fName.LastIndexOf("\") + 1);//这里 .LastIndexOf("\")是截取\符号在fName中的最后一位索引 16 string path = lpath.Substring(0,lpath.LastIndexOf(".")); 17 string[] str = path.Split(','); 18 for (int i = 0; i < dataGridView1.Rows[0].Cells.Count; i++) 19 { 20 dataGridView1.Rows[0].Cells[i].Value = str[i + 1]; 21 } 22 } 23 catch 24 { 25 26 }
/// <summary>
        /// 获取图片缩放比例
        /// </summary>
        /// <returns>计算X轴还是Y轴</returns>
        private float scale(string XY)
        {
            Image img = Image.FromFile(fName);//根据路径获取图片
            if (pictureBox1.Height > 0)
            {
                if (XY == "X")
                {
                    Xsfbl = (pictureBox1.Width * 1.0f) / img.Width;
                    return Xsfbl;
                }
                if (XY == "Y")
                {
                    Ysfbl = (pictureBox1.Height * 1.0f) / img.Height;
                    return Ysfbl;
                }
            }
            return 0;
        }
获取图片缩放比例

将图片转为为黑白图片

这个功能实现的方式就是通过循环得到并修改图片的每一个像素的颜色值(Bitmap.GetPixel(x,y)),最后将修改过的图片return出去。
修改像素时,因为每个色素的三原色满值是255,所以用255减去原来的值得到的就是相仿的颜色。再次执行这个方法可以将图片转回原来的颜色
如果想实现图片的灰化,可以取三原色的平均值。
/// <summary>
        /// 将图片转为为黑白图片
        /// </summary>
        /// <param name="mybt">要进行处理的图片</param>
        /// <param name="width">图片的长度</param>
        /// <param name="height">图片的高度</param>
        /// <returns>已经被处理后的黑白图片</returns>
        public Bitmap BWPic(Bitmap mybm, int width, int height)
        {
            Bitmap bm = new Bitmap(width, height);//初始化一个Bitmap对象,用来记录处理后的图片
            int x, y, result;//x,y是循环次数,result是记录处理后的像素值
            Color pixel;
            for (x = 0; x < width; x++)
            {
                for (y = 0; y < height; y++)
                {
                    pixel = mybm.GetPixel(x, y);//获取当前坐标的像素值
                    //result = (pixel.R + pixel.G + pixel.B) / 3;//取红绿蓝三色的平均值(图片灰化)
                    //绘图,把处理后的值赋值到刚才定义的bm对象里面
                    bm.SetPixel(x, y, Color.FromArgb(255 - pixel.R, 255 - pixel.G, 255 - pixel.B));//翻转三原色
                }
            }
            return bm;//返回黑白图片
        }

将图片进行X,Y轴的翻转

 图片翻转只需要用到bitmap类的RotateFlip方法

/// <summary>
        /// 旋转图片
        /// </summary>
        /// <param name="img"></param>
        /// <returns></returns>
        public static Bitmap KiRotate(Bitmap img,string XY)
        {
            try
            {
                if (XY == "x")
                {
                    img.RotateFlip(RotateFlipType.Rotate180FlipX);
                }
                else
                {
                    img.RotateFlip(RotateFlipType.Rotate180FlipY);
                }
                return img;
            }
            catch
            {
                return null;
            }
        }
旋转图片

第二个参数只为了判断这次操作是旋转X轴还是Y轴

小结:

这两个功能主要是通过Bitmap获取图片的对象,然后进行控件赋值或者对图片对象的修改。

但是这里实现图片颜色翻转的方法,速度很慢,如果图片清晰度过高,会卡主程序几秒钟。

原文地址:https://www.cnblogs.com/big-lll/p/7746160.html