文章内容

2017/2/18 14:21:45,作 者: 黄兵

c#旋转图片

这几天开发一个程序,需要将一个图片旋转360度然后每一个角度保存下来。刚开始本来想着是让美工弄的,但是让一个美工手动转360度,她会喷你一脸。

using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
namespace 图片旋转程序
{
    public class ImageHelper
    {
        /// <summary>  
        /// 以逆时针为方向对图像进行旋转  
        /// </summary>  
        /// <param name="b">位图流</param>  
        /// <param name="angle">旋转角度[0,360](前台给的)</param>  
        /// <returns></returns>  
        public Image RotateImg(Image b, int angle, string file)
        {
            angle = angle % 360;
            //弧度转换  
            double radian = angle * Math.PI / 180.0;
            double cos = Math.Cos(radian);
            double sin = Math.Sin(radian);
            //原图的宽和高  
            int w = b.Width;
            int h = b.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(angle);
            //恢复图像在水平和垂直方向的平移  
            g.TranslateTransform(-center.X, -center.Y);
            g.DrawImage(b, rect);
            //重至绘图的所有变换  
            g.ResetTransform();
            g.Save();
            g.Dispose();
            //保存旋转后的图片  
            dsImage.Save(@"D:\img\" + Path.GetFileNameWithoutExtension(file) + "\\" + angle + ".png", System.Drawing.Imaging.ImageFormat.Png);
            return dsImage;
        }
        public Image RotateImg(string filename, int angle, string file)
        {
            return RotateImg(GetSourceImg(filename), angle, file);
        }
        public Image GetSourceImg(string filename)
        {
            Image img;
            img = Bitmap.FromFile(filename);
            return img;
        }  
    }
    class Program
    {
        static void Main(string[] args)
        {
            string[] strArr = Directory.GetFiles(@"D:\img");
            foreach (string file in strArr)
            {
                Console.WriteLine(file);         //输出E:\123\新建文本文件.txt
                Console.WriteLine(Path.GetFileNameWithoutExtension(file));
                //如果要保存的目录不存在,则先创建
                if (!Directory.Exists(@"D:\img\" + Path.GetFileNameWithoutExtension(file)))
                {
                    Directory.CreateDirectory(@"D:\img\" + Path.GetFileNameWithoutExtension(file));
                }
                FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read);
                Image img = Bitmap.FromStream(fs);
                ImageHelper IH = new ImageHelper();
                for (int i = 1; i <= 360; i++)
                {
                    IH.RotateImg(img, i, file);
                }
                fs.Close();
            }
            Console.ReadKey();
        }
    }
}

转载自:cnblogs-逆心

分享到:

发表评论

评论列表