在WPF程序中將控件所呈現的內容保存成圖像


有的時候,我們需要將控件所呈現的內容保存成圖像保存下來,例如:InkCanvas的手寫墨跡,WebBrowser中的網頁等。可能有人會說,這個不就是截圖嘛,找到控件的坐標和大小,調用截圖API不就可以了嘛。的確,對於規則的控件來說,通過截圖的卻可以實現,可是,如果控件不規則或不透明度不是100%,則會把其背景控件的視覺效果也給截取下來。

要實現只對控件進行截圖,可以利用RenderTargetBitmap類獲取Visual對象的視覺效果,從而實現對控件截圖效果。

    RenderTargetBitmap RenderVisaulToBitmap(Visual vsual, int width, int height)
    {
        var rtb = new RenderTargetBitmap(width, height, 96, 96, PixelFormats.Default);
        rtb.Render(vsual);

        return rtb;
    }

這里需要說明一下,Visual對象的AlignmentMargin等影響布局的屬性也會獲取下來,例如,對如下按鈕截圖時,

<Button Content="Button" Margin="10,10,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75" Height="22" />

按鈕的起點坐標就不是(0,0),而是(10,10)。如果我們要把按鈕的起點起點坐標設置為(0,0),則需要在Button屬性把AlignmentMargin等屬性去掉。既要去掉AlignmentMargin等屬性,又要保持按鈕的位置和大小不變,一個簡單的做法是在按鈕外面添加一個Border,在Broder中設置這些屬性(在VisualStudio和Blend中設置一下分組即可,一步即可完成)。

    <Border Margin="10,10,0,0" VerticalAlignment="Top" HorizontalAlignment="Left" Width="75" Height="22">
        <Button Content="Button"/>
    </Border>

通過RenderVisaulToBitmap函數,就可以把控件的視覺效果轉換為RenderTargetBitmap對象了,RenderTargetBitmap對象繼承自BitmapSource,是可以直接在Image控件中顯示的。如果要更進一步把它轉換為圖像,則可以按照我以前的文章給圖片加上陰影效果文章所示通過一個PngBitmapEncoderBitmapSource對象保存為圖片。

        public enum ImageFormat { JPG, BMP, PNG, GIF, TIF }

        void GenerateImage(BitmapSource bitmap, ImageFormat format, Stream destStream)
        {
            BitmapEncoder encoder = null;

            switch (format)
            {
                case ImageFormat.JPG:
                    encoder = new JpegBitmapEncoder();
                    break;
                case ImageFormat.PNG:
                    encoder = new PngBitmapEncoder();
                    break;
                case ImageFormat.BMP:
                    encoder = new BmpBitmapEncoder();
                    break;
                case ImageFormat.GIF:
                    encoder = new GifBitmapEncoder();
                    break;
                case ImageFormat.TIF:
                    encoder = new TiffBitmapEncoder();
                    break;
                default:
                    throw new InvalidOperationException();
            }

            encoder.Frames.Add(BitmapFrame.Create(bitmap));
            encoder.Save(destStream);
        }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM