• 合并图片添加水印并压缩文件提供下载


    dotNet疯狂之路No.30

     今天很残酷,明天更残酷,后天很美好,但是绝大部分人是死在明天晚上,只有那些真正的英雄才能见到后天的太阳。

     We're here to put a dent in the universe. Otherwise why else even be here?  

    前几天公司急需一批台卡 生成带参数二维码 和背景图片合为一张图片 合成图片还需要加上水印  开始是美工一张张做 几千张哈哈累死美工了 老板要求写个生成功能 所以我就试水了

    一、生成二维码部分(一次生成几千张 先保存下来备用)

        /// <summary>
        /// 保存批次二维码至本地//一次生成几千张 先保存下来备用
        /// </summary>
        /// <param name="code"></param>
        /// <param name="name"></param>
        public static void setBatchImg(string strCode, string batch,int i)
        {
    
    
            Bitmap bitmap = QRCodeEncoderUtil(strCode);//调用二维码编码方法生成位图
    
            var ms = new MemoryStream();
    
            bitmap.Save(ms, ImageFormat.Png);
    
            String relPath = "/XXXX/XXXX/XXXX/XXXX" + batch + "/";//文件夹路径
    
            string path = System.Web.HttpContext.Current.Server.MapPath(relPath);
    
            if (!System.IO.Directory.Exists(path)) //如果文件夹不存在则创建
            {
                System.IO.Directory.CreateDirectory(path);
            }
            Log.WriteLog(path + batch + "_" + i + ".png");
            bitmap.Save(path + batch + "_" + i + ".png", ImageFormat.Png);///二维码保存
             
        }
    
        /// <summary>  
        /// 生成二维码  
        /// </summary>  
        /// <param name="qrCodeContent">要编码的内容</param>  
        /// <returns>返回二维码位图</returns>  
        public static Bitmap QRCodeEncoderUtil(string qrCodeContent)
        {
            QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
            qrCodeEncoder.QRCodeVersion = 0;/// 数字越大二维码密集度越高
    
            Bitmap img = qrCodeEncoder.Encode(qrCodeContent, Encoding.UTF8);//指定utf-8编码, 支持中文  
            return img;
    
        }

    二、调整二维码大小(适用背景图片上二维码区域)

     
        string qrPath="XXXX/XXXX/XXXX/XXXX.png";
     
         Bitmap b = new Bitmap(qrPath);
         System.Drawing.Image i = resizeImage(b, new Size(width, height));// 调用调整方法进行调整 返回Image 保存至本地备用
         string rePath = Server.MapPath("XXXXX") + "\XXXX\reqr.png";
         i.Save(rePath);
         i.Dispose();


        //调整图像大小
        private static System.Drawing.Image resizeImage(System.Drawing.Image imgToResize, Size size)
        {
            //获取图片宽度
            int sourceWidth = imgToResize.Width;
            //获取图片高度
            int sourceHeight = imgToResize.Height;
    
            float nPercent = 0;
            float nPercentW = 0;
            float nPercentH = 0;
    
            //计算宽度的缩放比例
            nPercentW = ((float)size.Width / (float)sourceWidth);
    
            //计算高度的缩放比例
            nPercentH = ((float)size.Height / (float)sourceHeight);
    
            if (nPercentH < nPercentW)
                nPercent = nPercentH;
            else
                nPercent = nPercentW;
    
            //期望的宽度
            int destWidth = (int)(sourceWidth * nPercent);
    
            //期望的高度
            int destHeight = (int)(sourceHeight * nPercent);
    
            Bitmap b = new Bitmap(destWidth, destHeight);
            Graphics g = Graphics.FromImage((System.Drawing.Image)b);
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
    
            //绘制图像
            g.DrawImage(imgToResize, 0, 0, destWidth, destHeight);
            g.Dispose();
            imgToResize.Dispose();
            return (System.Drawing.Image)b;
        }

    三、合成图片二维码和背景合为一张图片

        //图片合成函数(这里合成两张图片 可累加)
        private void MergeImage(string strBg, string strQr, string name)
        {
    
    
            int x = 0;
            int y = 0;
    
    
            if (Custom.Value.ToString().Equals("1"))//是否开启自定义
            {
                x = int.Parse(imgx.Value) * 2;
                y = int.Parse(imgy.Value) * 2;
            }
            else
            {
                x = int.Parse(imgx.Value);
                y = int.Parse(imgy.Value);
            }
    
    
            // 数组元素个数(即要拼图的图片个数)
            int lenth = 2;
            // 图片集合
            Bitmap[] maps = new Bitmap[lenth];
            //图片对应纵坐标集合
            int[] pointY = new int[lenth];
            //读取本地图片初始化Bitmap
            Bitmap map = null;
    
            //第一个图片对象,背景图片
            map = new Bitmap(strBg);
            maps[0] = map;
            pointY[0] = 0;
    
    
            //第二个图片对象,二维码
            map = new Bitmap(strQr);
            maps[1] = map;
            pointY[1] = y;
    
    
            // 初始化背景图片的宽高
            Bitmap bitMap = new Bitmap(maps[0].Width, maps[0].Height);
    
            // 初始化画板
            Graphics g1 = Graphics.FromImage(bitMap);
    
    
            //绘制第一个图片,背景图
    
            for (int i = 0; i < maps[0].Width; i++)
            {
                for (int j = 0; j < maps[0].Height; j++)
                {
                    // 以像素点形式绘制(将要拼图的图片上的每个坐标点绘制到拼图对象的指定位置,直至所有点都绘制完成)
                    var temp = maps[0].GetPixel(i, j);
                    // 将图片画布的点绘制到整体画布的指定位置
                    bitMap.SetPixel(i, pointY[0] + j, temp);
                }
            }
    
            maps[0].Dispose();
    
            //绘制第二个图片,二维码
            for (int i = 0; i < maps[1].Width; i++)
            {
                for (int j = 0; j < maps[1].Height; j++)
                {
                    var temp = maps[1].GetPixel(i, j);
                    bitMap.SetPixel(x + i, pointY[1] + j, temp);
                }
            }
    
            maps[1].Dispose();
            
        
    string batch = batchCode.Value.ToString(); // 保存输出到本地 if (!System.IO.Directory.Exists(Server.MapPath("XXXX") + "/XXXX/XXXX" + batch + "/")) //如果文件夹不存在则创建 { System.IO.Directory.CreateDirectory(Server.MapPath("XXXX") + "/XXXX/XXXX" + batch + "/"); } bitMap.Save(Server.MapPath("XXXX") + "/XXXX/XXXX" + batch + "/" + batch + "_" + name + ".png"); g1.Dispose(); bitMap.Dispose(); }

    四、添加水印

        /// <summary>
        /// 水印文字
        /// </summary>
        /// <param name="fileName"></param>
        /// <param name="text"></param>
        private void AddTextToImg(string fileName, string text)
        {
    
            int x = 0;
            int y = 0;
    
    
            if (Custom.Value.ToString().Equals("1"))//是否开启自定义
            {
                x = int.Parse(ztimgx.Value) * 2;
                y = int.Parse(ztimgy.Value) * 2;
            }
            else
            {
                x = int.Parse(ztimgx.Value);
                y = int.Parse(ztimgy.Value);
            }
    
            if (text == string.Empty)
            {
                return;
            }
            //还需要判断文件类型是否为图像类型,这里就不赘述了
    
            System.Drawing.Image image = System.Drawing.Image.FromFile(fileName);
            Bitmap bitmap = new Bitmap(image, image.Width, image.Height);
            Graphics g = Graphics.FromImage(bitmap);
    
            float fontSize = 55.0f;    //字体大小
            float textWidth = text.Length * fontSize;  //文本的长度
            //下面定义一个矩形区域,以后在这个矩形里画上白底黑字
            float rectX = x;
            float rectY = y;
            float rectWidth = text.Length * (fontSize);
            float rectHeight = fontSize + 18;
            //声明矩形域
            RectangleF textArea = new RectangleF(rectX, rectY, rectWidth, rectHeight);
    
            Font font = new Font("宋体", fontSize);   //定义字体
            Brush whiteBrush = new SolidBrush(Color.Black);   //黑笔刷,画文字用
            Brush blackBrush = new SolidBrush(Color.White);   //白笔刷,画背景用
    
            g.FillRectangle(blackBrush, rectX, rectY, rectWidth, rectHeight);
    
            g.DrawString(text, font, whiteBrush, textArea);
    
    
            string batch = batchCode.Value.ToString();
    
                // 保存输出到本地
                if (!System.IO.Directory.Exists(Server.MapPath("XXXX") + "/XXXX/XXXX" + batch + "/")) //如果文件夹不存在则创建
                {
                    System.IO.Directory.CreateDirectory(Server.MapPath("XXXX") + "/XXXX/XXXX" + batch + "/");
                }
    
                bitmap.Save(Server.MapPath("XXXX") + "/XXXX/XXXXX" + batch + "/" + batch + "_" + text + ".png");
            
            g.Dispose();
            bitmap.Dispose();
            image.Dispose();
        }

    五、调取所有方法进行合成

        /// <summary>
        /// 生成批次台卡生成压缩包
        /// </summary>
        private void CreateBatchImg()
        {
    
            string batch = "XXXXX.png";
    
                string bgPath = "";
    
                int width = 0;
    
                int height = 0;
    
                for (int j = 0; j < 3000; j++)
                {
                    
                         
                        setBatchImg("生成二维码的参数", batch, j);///保存图片至本地
                         
                        string qrPath = Server.MapPath("XXXX") + "\XXXX\XXXX" + batch + "\" + batch + "_" + j + ".png";
                        
                            bgPath = Server.MapPath("XXXXX") + "\" +XXXX + ".png";
                            width = int.Parse(imgwith.Value);
                            height = int.Parse(imgheight.Value);
                       
                        //调整二维码大小
                        Bitmap b = new Bitmap(qrPath);
                        System.Drawing.Image i = resizeImage(b, new Size(width, height));
                        string rePath = Server.MapPath("XXXX") + "\XXXX\reqr.png";
                        i.Save(rePath);
                        i.Dispose();
                        MergeImage(bgPath, rePath, j.ToString());
                        AddTextToImg(Server.MapPath("Images") + "/TemQrErBatch" + batch + "/" + batch + "_" + j + ".png", j.ToString());
    
                      
                    }
    
                }
    
    
                
    
                string relPath = "/XXXX/XXXX/XXXX/XXXXX" + batch + "/";
    
                string relPath2 = "/XXXX/XXXX/XXXX/";
    
    
                string path =  Server.MapPath(relPath);
                string path2 =  Server.MapPath(relPath2);//压缩路径
    
                if (!Directory.Exists(path))
                {
                    // Create the directory it does not exist.
                    Directory.CreateDirectory(path);
                }
    
                if (System.IO.Directory.Exists(path)) //如果文件夹不存在则创建
                {
                    string[] FileProperties = new string[2];
                    FileProperties[0] = path;//待压缩文件目录 
                    FileProperties[1] = path2 + "XXXX" + batch + ".zip";  //压缩后的目标文件
     
                    ZipFloClass.ZipFiles(FileProperties[0], FileProperties[1]);
                    
                }
     
                ZipUrl.Value = "XXXX/XXXX/XXXX" + batch + ".zip";
     
        }
  • 相关阅读:
    查找并拷贝目录中指定文件到某个文件夹
    TPS和QPS的概念
    50道 Redis常见面试题,干货汇总
    面试题:写一个死锁示例
    MySQL聚集索引与辅助索引的区别
    Java进阶知识点:接口幂等性
    测试网络联接状况常用命令 ping 使用方法介绍
    服务路由、负载均衡和服务配置中心的基本概念
    利用堆排序和分治法求解千万级数据排序的Top K问题—百度面试
    创建Spring Boot项目时,提示 Cannot download 'https://start.spring.io'
  • 原文地址:https://www.cnblogs.com/moxuanshang/p/7595413.html
Copyright © 2020-2023  润新知