C# 更換微信小程序碼中間的logo圖層

        /// <summary>
        /// 更換小程序碼中間的logo
        /// </summary>
        /// <param name="wxQrCodePath">微信接口返回生成的小程序碼路徑</param>
        /// <param name="storeLogo">拼接進去的圖片路徑</param>
        /// <param name="savePath">保存路徑</param>
        /// <returns></returns>
        public string WxQrCodeDemo(string wxQrCodePath, string storeLogo, string savePath)
        {
            Image mImage = Image.FromFile(wxQrCodePath);
            using (Bitmap bitmap = new Bitmap(mImage))
            {
                Rectangle rec = new Rectangle();
                rec.X = 75;
                rec.Y = 75;
                rec.Width = 130;
                rec.Height = 130;
                using (Graphics g = Graphics.FromImage(bitmap))
                {
                    Pen pen = new Pen(Color.White);
                    g.DrawEllipse(pen, rec);
                    Brush b = new SolidBrush(Color.White);
                    g.FillPath(b, GetRoundRectangle(rec, 65));//中間畫白色圓
                }
                bitmap.Save(wxQrCodePath, System.Drawing.Imaging.ImageFormat.Jpeg);//注意保存路徑(模板文件)
            }
            mImage.Dispose();
            Image regionImage = Image.FromFile(wxQrCodePath);//模板文件
            Image addImg = Image.FromFile(storeLogo);//需要拼接進去的圖片
            Image lastImg = CombinImage(regionImage, addImg, 135);//拼接圖片(設置固定的135px-可根據需要改)
            Bitmap lastmap = new Bitmap(lastImg);
            lastmap.Save(savePath, System.Drawing.Imaging.ImageFormat.Png);//注意保存路徑
            addImg.Dispose();
            lastmap.Dispose();
            regionImage.Dispose();
            lastImg.Dispose();
            return savePath;

        }
        /// <summary> 
        /// 根據普通矩形得到圓角矩形的路徑 
        /// </summary> 
        /// <param name="rectangle">原始矩形</param> 
        /// <param name="r">半徑</param> 
        /// <returns>圖形路徑</returns> 
        private static GraphicsPath GetRoundRectangle(Rectangle rectangle, int r)
        {
            int l = 2 * r;
            // 把圓角矩形分成八段直線、弧的組合,依次加到路徑中 
            GraphicsPath gp = new GraphicsPath();
            gp.AddLine(new Point(rectangle.X + r, rectangle.Y), new Point(rectangle.Right - r, rectangle.Y));
            gp.AddArc(new Rectangle(rectangle.Right - l, rectangle.Y, l, l), 270F, 90F);

            gp.AddLine(new Point(rectangle.Right, rectangle.Y + r), new Point(rectangle.Right, rectangle.Bottom - r));
            gp.AddArc(new Rectangle(rectangle.Right - l, rectangle.Bottom - l, l, l), 0F, 90F);

            gp.AddLine(new Point(rectangle.Right - r, rectangle.Bottom), new Point(rectangle.X + r, rectangle.Bottom));
            gp.AddArc(new Rectangle(rectangle.X, rectangle.Bottom - l, l, l), 90F, 90F);

            gp.AddLine(new Point(rectangle.X, rectangle.Bottom - r), new Point(rectangle.X, rectangle.Y + r));
            gp.AddArc(new Rectangle(rectangle.X, rectangle.Y, l, l), 180F, 90F);
            return gp;
        }
        /// <summary>
        /// 獲取縮小後的圖片
        /// </summary>
        /// <param name="bm">要縮小的圖片</param>
        /// <param name="times">要縮小的倍數</param>
        /// <returns></returns>
        private Bitmap GetSmall(Bitmap bm, double times)
        {
            int nowWidth = (int)(bm.Width / times);
            int nowHeight = (int)(bm.Height / times);
            Bitmap newbm = new Bitmap(nowWidth, nowHeight);//新建一個放大後大小的圖片

            if (times >= 1 && times <= 1.1)
            {
                newbm = bm;
            }
            else
            {
                Graphics g = Graphics.FromImage(newbm);
                g.InterpolationMode = InterpolationMode.HighQualityBicubic;
                g.SmoothingMode = SmoothingMode.HighQuality;
                g.CompositingQuality = CompositingQuality.HighQuality;
                g.DrawImage(bm, new Rectangle(0, 0, nowWidth, nowHeight), new Rectangle(0, 0, bm.Width, bm.Height), GraphicsUnit.Pixel);
                g.Dispose();
            }
            return newbm;

}

 

        /// <summary>
        /// 調用此函數後使此兩種圖片合併,類似相冊,有個
        /// 背景圖,中間貼自己的目標圖片
        /// </summary>
        /// <param name="imgBack">粘貼的源圖片</param>
        /// <param name="destImg">粘貼的目標圖片</param>
        public  Image CombinImage(Image imgBack, Image img, int r)
        {
            Bitmap imgMap = new Bitmap(img);
            double smallTimes = imgMap.Width / r;//縮小圖片倍數
            img = GetSmall(imgMap, smallTimes);//進行圖片縮小
            if ((img.Width<r || img.Height<r))
            {
                if (img.Width>img.Height)
                {
                    r = img.Height;
                }
                else
                {
                r = img.Width;

                }
            }
            img = CutEllipse(img, new Rectangle(0, 0, r, r), new Size(r, r));
            Graphics g = Graphics.FromImage(imgBack);
            g.DrawImage(imgBack, 0, 0, imgBack.Width, imgBack.Height); 
            g.DrawImage(img, imgBack.Width / 2 - img.Width / 2, imgBack.Width / 2 - img.Width / 2, img.Width, img.Height);
            GC.Collect();
            g.Dispose();
            img.Dispose();
            return imgBack;
        }

效果如下:

參考:https://www.cnblogs.com/cyj0923/p/9511030.html


        }

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章