[英]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
保存到磁盤。
所以我的問題是:
image
寫入BlankMap
?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.