這個問題看似很簡單,但實際在網路找尋相關資源來實作都會碰到相同問題。
就是: 為何輸出的圖片與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();
}