WPF 下兩種圖片合成或加浮水印的方式(轉載)

來源:互聯網
上載者:User

標籤:定義   12px   raw   加浮水印   mil   src   pdo   sig   tran   

來源:http://www.cnblogs.com/lxblog/

 

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

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

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

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

把準備的素材拷貝到項目中,其檔案屬性【複製到輸出目錄】選擇【始終複製】,【產生操作】選擇【內容】。

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

方法一

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;        }

方法二

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

 

WPF 下兩種圖片合成或加浮水印的方式(轉載)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.