Должен ли я избавиться от растрового изображения и его клона? - PullRequest
1 голос
/ 22 февраля 2020

Я пытаюсь обрезать растровое изображение. Я нашел этот код, который кажется самым быстрым решением, поскольку он использует растровые данные вместо создания копии (как это делает конструктор копирования). Это нормально, поскольку мне вообще не нужен оригинал, и я бы даже изменил оригинал, если бы это было возможно. Весь смысл в том, чтобы обойти ошибку в другой библиотеке:

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() создает новое растровое изображение, которое должно быть удалено. Первоначально, когда в библиотеке не было ошибки, я просто возвратил bitmap, которую вызывающая сторона уничтожила. Но теперь мне нужна вся эта логика обрезки c, потому что CreateBitmap иногда будет возвращать растровое изображение с белыми краями вокруг, которые нужно обрезать. Проблема в том, что я не уверен, нужно ли мне располагать как исходное растровое изображение, так и клон. Здесь я удаляю оригинал всякий раз, когда клонирую его (а вызывающий объект удаляет клон), но я боюсь, что иногда он может сломать клон. Согласно этому объяснению , Clone на самом деле не создает клон, но повторно использует исходные данные, поэтому, возможно, удаление оригинала иногда освобождает память, используемую клоном, и выдает ошибку, когда вызывающая сторона пытается используйте его.

С другой стороны, если я не утилизирую оригинал, я не уверен, что утилизация клона также удалит все, что необходимо удалить в оригинале. Я ничего не нашел в документации, и, глядя на исходный код, я вижу, что он вызывает некоторые нативные методы, которые я понятия не имею, что они делают.

...