亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C# > 正文

WPF實現圖片合成或加水印的方法【2種方法】

2020-01-24 00:43:47
字體:
來源:轉載
供稿:網友

本文實例講述了WPF實現圖片合成或加水印的方法。分享給大家供大家參考,具體如下:

最近項目中應用多次應用了圖片合成,為了今后方便特此記下。

在WPF下有兩種圖片合成的方式,一種還是用原來C#提供的GDI+方式,命名空間是System.Drawing 和 System.Drawing.Imaging,另一種是WPF中新添加的API,命名空間是 System.Windows.Media 和 System.Windows.Media.Imaging 。

我們來做一個簡單的例子,分別用上面的兩種方式實現,功能是在一個背景圖上面,畫一個頭像,然后在寫一個簽名。

首先準備一張背景圖(bg.jpg)和兩個頭像圖片(tiger.png 和 lion.png)最后的生成的圖片效果如下圖:

把準備的素材拷貝到項目中,其文件屬性【復制到輸出目錄】選擇【始終復制】,【生成操作】選擇【內容】。

這里貼一下兩種方式的主要代碼,具體代碼可以在文章最后點擊下載。

第一種方式

使用RenderTargetBitmap 和 DrawingVisual 方式

private BitmapSource MakePicture(string bgImagePath, string headerImagePath, string signature){  //獲取背景圖  BitmapSource bgImage = new BitmapImage(new Uri(bgImagePath, UriKind.Relative));  //獲取頭像  BitmapSource headerImage = new BitmapImage(new Uri(headerImagePath, UriKind.Relative));  //創建一個RenderTargetBitmap 對象,將WPF中的Visual對象輸出  RenderTargetBitmap composeImage = new RenderTargetBitmap(bgImage.PixelWidth, bgImage.PixelHeight, bgImage.DpiX, bgImage.DpiY, PixelFormats.Default);  FormattedText signatureTxt = new FormattedText(signature,      System.Globalization.CultureInfo.CurrentCulture,      System.Windows.FlowDirection.LeftToRight,      new Typeface(System.Windows.SystemFonts.MessageFontFamily, FontStyles.Normal, FontWeights.Normal, FontStretches.Normal),      50,      System.Windows.Media.Brushes.White);  DrawingVisual drawingVisual = new DrawingVisual();  DrawingContext drawingContext = drawingVisual.RenderOpen();  drawingContext.DrawImage(bgImage, new Rect(0, 0, bgImage.Width, bgImage.Height));  //計算頭像的位置  double x = (bgImage.Width / 2 - headerImage.Width) / 2;  double y = (bgImage.Height - headerImage.Height) / 2 - 100;  drawingContext.DrawImage(headerImage, new Rect(x, y, headerImage.Width, headerImage.Height));  //計算簽名的位置  double x2 = (bgImage.Width/2 - signatureTxt.Width) / 2;  double y2 = y + headerImage.Height + 20;  drawingContext.DrawText(signatureTxt, new System.Windows.Point(x2, y2));  drawingContext.Close();  composeImage.Render(drawingVisual);  //定義一個JPG編碼器  JpegBitmapEncoder bitmapEncoder = new JpegBitmapEncoder();  //加入第一幀  bitmapEncoder.Frames.Add(BitmapFrame.Create(composeImage));  //保存至文件(不會修改源文件,將修改后的圖片保存至程序目錄下)  string savePath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"/合成.jpg";  bitmapEncoder.Save(File.OpenWrite(Path.GetFileName(savePath)));  return composeImage;}

第二種方式

利用原來的GDI+方式

private BitmapSource MakePictureGDI(string bgImagePath, string headerImagePath, string signature){  GDI.Image bgImage = GDI.Bitmap.FromFile(bgImagePath);  GDI.Image headerImage = GDI.Bitmap.FromFile(headerImagePath);  //新建一個畫板,畫板的大小和底圖一致  System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(bgImage.Width, bgImage.Height);  System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(bitmap);  //設置高質量插值法  g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;  //設置高質量,低速度呈現平滑程度  g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;  //清空畫布并以透明背景色填充  g.Clear(System.Drawing.Color.Transparent);  //先在畫板上面畫底圖  g.DrawImage(bgImage, new GDI.Rectangle(0, 0, bitmap.Width, bitmap.Height));  //再在畫板上畫頭像  int x = (bgImage.Width / 2 - headerImage.Width) / 2;  int y = (bgImage.Height - headerImage.Height) / 2 - 100;  g.DrawImage(headerImage, new GDI.Rectangle(x, y, headerImage.Width, headerImage.Height),               new GDI.Rectangle(0, 0, headerImage.Width, headerImage.Height),               GDI.GraphicsUnit.Pixel);  //在畫板上寫文字  using (GDI.Font f = new GDI.Font("Arial", 20, GDI.FontStyle.Bold))  {    using (GDI.Brush b = new GDI.SolidBrush(GDI.Color.White))    {      float fontWidth = g.MeasureString(signature, f).Width;      float x2 = (bgImage.Width / 2 - fontWidth) / 2;      float y2 = y + headerImage.Height + 20;      g.DrawString(signature, f, b, x2, y2);    }  }  try  {    string savePath = System.AppDomain.CurrentDomain.SetupInformation.ApplicationBase + @"/GDI+合成.jpg";    bitmap.Save(savePath, System.Drawing.Imaging.ImageFormat.Jpeg);    return ToBitmapSource(bitmap);  }  catch (System.Exception e)  {    throw e;  }  finally  {    bgImage.Dispose();    headerImage.Dispose();    g.Dispose();  }}#region GDI+ Image 轉化成 BitmapSource[System.Runtime.InteropServices.DllImport("gdi32")]static extern int DeleteObject(IntPtr o);public BitmapSource ToBitmapSource(GDI.Bitmap bitmap){  IntPtr ip = bitmap.GetHbitmap();  BitmapSource bitmapSource = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(    ip, IntPtr.Zero, System.Windows.Int32Rect.Empty,    System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());  DeleteObject(ip);//釋放對象  return bitmapSource;}#endregion

附:完整實例代碼點擊此處本站下載。

更多關于C#相關內容感興趣的讀者可查看本站專題:《C#常見控件用法教程》、《WinForm控件用法總結》、《C#數據結構與算法教程》、《C#面向對象程序設計入門教程》及《C#程序設計之線程使用技巧總結

希望本文所述對大家C#程序設計有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
热久久这里只有精品| 色婷婷av一区二区三区久久| 国产成人精品av| 国产日韩在线免费| 91精品美女在线| 欧美一级bbbbb性bbbb喷潮片| 欧美日韩在线免费观看| 欧美午夜性色大片在线观看| 欧美性生交xxxxxdddd| 成人中文字幕在线观看| 国产91成人video| 日韩精品中文字幕在线| 中文在线不卡视频| 九九热在线精品视频| 91精品国产色综合| 日韩免费av一区二区| 亚洲精品久久视频| 亚洲一区第一页| 国产精自产拍久久久久久蜜| 97国产在线视频| 亚洲天堂网站在线观看视频| 久久久精品在线| 欧美一级在线播放| 免费91麻豆精品国产自产在线观看| 有码中文亚洲精品| 欧美黄色成人网| 久久人体大胆视频| 国产精品夫妻激情| 久久久99久久精品女同性| 欧美成aaa人片免费看| 大伊人狠狠躁夜夜躁av一区| 亚洲一区二区三区毛片| 91丨九色丨国产在线| 国产精品99久久久久久久久| 2019亚洲男人天堂| 亚洲国产古装精品网站| 色婷婷亚洲mv天堂mv在影片| 国产色综合天天综合网| 一区二区三区在线播放欧美| 成人亚洲激情网| 亚洲美女www午夜| 久久久久久久久久国产精品| 国产97免费视| 精品视频—区二区三区免费| 日韩在线观看免费全| 在线电影av不卡网址| 国产做受69高潮| 欧美激情国内偷拍| 久久精品亚洲热| 一本色道久久88综合亚洲精品ⅰ| 中文字幕成人精品久久不卡| 久久久久久久网站| 日韩精品中文字幕视频在线| 久久精品电影一区二区| 久久人人97超碰精品888| 亚洲国产福利在线| 国产精品视频在线观看| 久久综合伊人77777蜜臀| 欧美黑人巨大xxx极品| 国产精品∨欧美精品v日韩精品| 国产精品久久久久久av下载红粉| 亚洲国产中文字幕久久网| 美女精品视频一区| 国内成人精品视频| 国产精品www色诱视频| 国产日韩视频在线观看| 久久天天躁狠狠躁夜夜躁2014| 亚洲一区二区福利| 日韩乱码在线视频| 91精品国产91久久久久久久久| 国产精品自拍偷拍视频| 国产精品久久久av| www高清在线视频日韩欧美| 91久久久久久国产精品| 欧美色另类天堂2015| 91av在线视频观看| www国产亚洲精品久久网站| 国内久久久精品| 国产v综合ⅴ日韩v欧美大片| 久久资源免费视频| 日本精品va在线观看| 97国产真实伦对白精彩视频8| 欧美亚洲激情视频| 一区二区三区黄色| 懂色av影视一区二区三区| 国产亚洲在线播放| 久久影视免费观看| 理论片在线不卡免费观看| 亚洲娇小xxxx欧美娇小| 国产日韩中文字幕在线| 日韩av电影免费观看高清| 性欧美办公室18xxxxhd| 97婷婷大伊香蕉精品视频| 国产精品欧美激情| 欧美亚洲国产另类| 97福利一区二区| 欧美成人性色生活仑片| 韩国福利视频一区| 国产精品精品国产| 日本中文字幕不卡免费| 欧美人在线观看| 91黑丝在线观看| 欧美日韩国产中文精品字幕自在自线| 欧美一级视频一区二区| 狠狠躁天天躁日日躁欧美| 中文字幕欧美视频在线| 国产美女搞久久| 亚洲永久在线观看| 欧美精品一区三区| 91久久久亚洲精品| 高清日韩电视剧大全免费播放在线观看| 久久中文字幕一区| 高清在线视频日韩欧美| 成人国产精品日本在线| 日韩欧美亚洲国产一区| 国产精品久久久久久av福利软件| 26uuu亚洲伊人春色| 成人久久精品视频| 中文字幕日韩欧美精品在线观看| 亚洲欧美日韩网| 国产精品日韩精品| 欧美在线一级va免费观看| 成人精品视频在线| 97精品在线观看| 亚洲天堂开心观看| 国产成人精品一区二区三区| 久久久久久999| 久久久国产精品视频| 亚洲美女精品成人在线视频| 久久久精品一区二区| 日韩成人在线观看| 日本久久久久亚洲中字幕| 亚洲人成网站免费播放| 欧美性xxxxxxx| 久久精品99无色码中文字幕| 在线看日韩欧美| 欧美日韩在线视频观看| 久操成人在线视频| 亚洲999一在线观看www| 国产91免费看片| www.午夜精品| 亚洲欧美国产制服动漫| 亚洲性生活视频| 都市激情亚洲色图| 91九色在线视频| 日本精品中文字幕| 欧美高清视频一区二区| 欧美精品一区三区| 欧美大片va欧美在线播放| 97在线视频一区| 成人国产精品久久久久久亚洲| 国产国语刺激对白av不卡| 日韩一区二区三区xxxx| 国产精品视频免费观看www| y97精品国产97久久久久久| 久久天天躁狠狠躁夜夜av| 97国产在线观看| 亚洲第一免费网站| 在线看福利67194| 国产乱人伦真实精品视频| 日韩在线小视频| 久久精品国产成人精品| 欧美性受xxxx黑人猛交| 亚洲视频视频在线|