簡體   English   中英

如何將圖像復制到 WriteableBitmap 的一部分(C# 和 WPF)

[英]How to copy an Image into a section of a WriteableBitmap (C# & WPF)

如果這是重復的,很抱歉。 我正在將一些 BitmapImages 寫入畫布的特定部分,就像這樣(片段)。 它工作正常:

  TreeFile = "pack://application:,,,/Images/" + TreeFile;

                        var image = new Image
                        {
                            Source = new BitmapImage(new Uri(TreeFile))
                        };
                        image.Width = 10;
                        image.Height = 10;

                        Canvas.SetLeft(image, x );
                        Canvas.SetTop(image, y );
                        MainCanvas.Children.Add(image);

我想做的是將image也復制到WriteableBitmap BlankMap; 在相同的時間和相同的位置(MainCanvas 和 BlankMap 的大小相同)。 這是為了創建“撤消”。 然后,假設用戶想保留新的合成圖像,將BlankMap復制到最終的BitmapImage WorkingMap; 最后,我需要將現在完成的WorkingMap保存到磁盤。

所以我的問題是:

  1. 使用 WriteableBitmaps 是正確的方法嗎?
  2. 我將如何將image寫入BlankMap
  3. 我將如何將BlankMap寫入WorkingMap (盡管 #2 和 #3 可能是相同的問題/答案。

謝謝! 如果這是某種形式的重復問題,再次道歉。

根據我使用映射工具的經驗,我擔心您正在應用一個在 WinForms 中有意義的思考過程並導致 WPF 出現問題。 請小心 WPF 中生成的圖像,因為它們很容易由於框架深處長期存在的錯誤而導致內存泄漏。

問題#1

這是執行“撤消”功能的正確方法嗎? 不可以。但是,WPF 允許您非常輕松地添加、移動和刪除元素。

我相信你會使用命令來實現你的更改,然后在你想撤消它時從堆棧中廢除一個命令。 但是,我還沒有看到任何有意義的例子。

問題2

當您使用現有的ImageSource初始化WriteableBitmap時,您只需將其傳遞到構造函數中即可對其進行初始化:

var BlankMap = new WriteableBitmap(image);

之后,您將遵循類文檔中列出的代碼示例。

問題#3

你會逆轉這個過程。


最重要的是,聽起來您想要進行某種圖形編輯。 位圖在 WinForms 中效果很好,所以很容易讓人相信它們在 WPF 中也能很好地工作。 他們不。 如果您將位圖的使用限制為僅顯示,那么您將更容易處理內存泄漏等問題。

這對我有用:

    public static void CopyImageTo(Image sourceImage, int x, int y, WriteableBitmap target)
    {
        BitmapSource source = sourceImage.Source as BitmapSource;

        int sourceBytesPerPixel = GetBytesPerPixel(source.Format);
        int sourceBytesPerLine = source.PixelWidth * sourceBytesPerPixel;

        byte[] sourcePixels = new byte[sourceBytesPerLine * source.PixelHeight];
        source.CopyPixels(sourcePixels, sourceBytesPerLine, 0);

        Int32Rect sourceRect = new Int32Rect(x, y, source.PixelWidth, source.PixelHeight);
        target.WritePixels(sourceRect, sourcePixels, sourceBytesPerLine, 0);
    }

    public static int GetBytesPerPixel(PixelFormat format)
    {
        return format.BitsPerPixel / 8;
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM