C# 我是否应该同时处理位图及其克隆?

C# 我是否应该同时处理位图及其克隆?,c#,bitmap,idisposable,C#,Bitmap,Idisposable,我正在尝试裁剪位图。我发现代码似乎是最快的解决方案,因为它重用位图数据而不是创建副本(就像复制构造函数那样)。那很好,因为我根本不需要原件,如果可能的话,我甚至会修改原件。关键在于解决另一个库中的bug: private static Bitmap GetBitmap(ChromiumWebBrowser browser, DefaultRenderHandler renderHandler) { Bitmap oldBitmap = null; try {

我正在尝试裁剪位图。我发现代码似乎是最快的解决方案,因为它重用位图数据而不是创建副本(就像复制构造函数那样)。那很好,因为我根本不需要原件,如果可能的话,我甚至会修改原件。关键在于解决另一个库中的bug:

private static Bitmap GetBitmap(ChromiumWebBrowser browser, DefaultRenderHandler renderHandler)
{
    Bitmap oldBitmap = null;

    try
    {
        var bitmap = renderHandler.BitmapBuffer.CreateBitmap();

        // Taking care of https://bitbucket.org/chromiumembedded/cef/issues/2864/osr-resize
        if (bitmap.Size != browser.Size)
        {
            oldBitmap = bitmap;
            var newWidth = Math.Min(bitmap.Size.Width, browser.Size.Width);
            var newHeight = Math.Min(bitmap.Size.Height, browser.Size.Height);
            var newX = (bitmap.Size.Width - newWidth) / 2;
            var newY = (bitmap.Size.Height - newHeight) / 2;
            return bitmap.Clone(new Rectangle(newX, newY, newWidth, newHeight), bitmap.PixelFormat);
        }
        else
            return bitmap;
    }
    finally
    {
        oldBitmap?.Dispose();
        Monitor.Exit(renderHandler.BitmapLock);
    }
}
因此这里
renderHandler.BitmapBuffer.CreateBitmap()
创建了一个必须处理的新位图。最初,当库中没有bug时,我只是返回调用方处理的
位图。但现在我需要所有的裁剪逻辑,因为
CreateBitmap
有时会返回需要裁剪的带有白色边缘的位图。问题是,我不确定是否需要同时处理原始位图和克隆。在这里,每当我克隆它时,我都会处理原始文件(调用者会处理克隆文件),但我担心它有时会破坏克隆文件。根据,
Clone
实际上并不创建克隆,而是重用原始数据,因此,处理原始数据有时可能会释放克隆使用的内存,并在调用方尝试使用时抛出错误


另一方面,如果我不处理原件,我不确定处理克隆是否也会处理原件中需要处理的所有内容。在文档中没有找到任何内容,查看源代码,我看到它调用了一些本机方法,但我不知道它们是怎么做的。

裁剪位图时“重用”位图对我来说并不是一个有效的想法。我更喜欢把一个新的小一点的扔掉,把旧的大一点的一块扔掉。。但我可能错了。@TaW但这会创建原始数据的完整副本并使用更多资源。为什么我要这样做?位图往往是一个内存块,您不希望分割它。但是,同样,这可能是完全错误的而且,不,我不会创建完整副本,只创建所需的大小。@TaW我的猜测是,
Clone
对原始数据没有任何作用,它只是按原样使用并覆盖剪切矩形。因此,这应该是相当节省资源的。在我链接的答案下面还有一个人,他运行了一些测试,
Clone
的速度要快得多。在裁剪位图时重用位图对我来说并不是一个有效的主意。我更喜欢把一个新的小一点的扔掉,把旧的大一点的一块扔掉。。但我可能错了。@TaW但这会创建原始数据的完整副本并使用更多资源。为什么我要这样做?位图往往是一个内存块,您不希望分割它。但是,同样,这可能是完全错误的而且,不,我不会创建完整副本,只创建所需的大小。@TaW我的猜测是,
Clone
对原始数据没有任何作用,它只是按原样使用并覆盖剪切矩形。因此,这应该是相当节省资源的。在我链接的答案下面还有一个人运行了一些测试,
Clone
速度更快。