2015年9月1日 星期二

C# WPF程式->如何將Canvas物件存成圖片

這個問題看似很簡單,但實際在網路找尋相關資源來實作都會碰到相同問題。

就是: 為何輸出的圖片與Canvas圖層上的畫面不同,那以下程式碼是解法!!!


步驟流程如下:
1. 將canvas做 UIElement Updata
2. 使用RenderTargetBitmap 將canvas物件存成bitmap物件
3. 使用FileStream存成指定格式的圖片。



//-------以下是圖片匯出

            //--設定圖片繪製方法
            ImageBrush Mybrush = new ImageBrush();
            //--將該.png 做成底圖
            Mybrush.ImageSource = new BitmapImage(new Uri(@"C:\CWB\EEW07.png", UriKind.Relative));
            //--繪製到canvas物件作為背景
            canvas.Background = Mybrush;

            //--以下對canvas物件做 UIElement更新
            Size tSize = new Size(canvas.Width, canvas.Height);
            //--更新canvas物件
            canvas.Measure(tSize);
            //--更新後的物件傳遞
            canvas.Arrange(new Rect(new Point(0, 0), tSize));

            //接著將圖像做保存
            //設定一個DrawingVisual 存放canvas的繪製結果
            DrawingVisual tDrawingVisual = new DrawingVisual();
            using (DrawingContext context = tDrawingVisual.RenderOpen())
            {
                //存放canvas
                VisualBrush tVisualBrush = new VisualBrush(canvas);
                //將像素塗滿
                tVisualBrush.Stretch = Stretch.Fill;
                //塗滿範圍為 0~ 880寬 與 0 ~ 600高
                context.DrawRectangle(tVisualBrush, null, new Rect(0, 0, 880, 600));
                context.Close();
            }

            //轉成BitMap的存放容器
            RenderTargetBitmap tRenderTargetBitmap = new RenderTargetBitmap((int)canvas.RenderSize.Width, (int)canvas.RenderSize.Height, 96d, 96d, PixelFormats.Default);
            //將我們剛剛繪製好的tDrawingVisual轉成bitmap物件
            tRenderTargetBitmap.Render(tDrawingVisual);

            //準備存進去
            using (FileStream tFileStream = new FileStream("C:\\Taiwan.png", FileMode.Create, FileAccess.Write))
            {
                //-我要存成Png格式 所以用PngBitmapEncoder
                PngBitmapEncoder tPngBitmapEncoder = new PngBitmapEncoder();
                //-然後啟用點陣圖交錯格式
                tPngBitmapEncoder.Interlace = PngInterlaceOption.On;
                //-將tRenderTargetBitmap轉成PNG
                tPngBitmapEncoder.Frames.Add(BitmapFrame.Create(tRenderTargetBitmap));
                //存到C:\\Taiwan.png 檔案中
                tPngBitmapEncoder.Save(tFileStream);
                //關閉
                tFileStream.Close();
            }

沒有留言:

張貼留言