Я пытаюсь обрезать растровое изображение. Я нашел этот код, который кажется самым быстрым решением, поскольку он использует растровые данные вместо создания копии (как это делает конструктор копирования). Это нормально, поскольку мне вообще не нужен оригинал, и я бы даже изменил оригинал, если бы это было возможно. Весь смысл в том, чтобы обойти ошибку в другой библиотеке:
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
на самом деле не создает клон, но повторно использует исходные данные, поэтому, возможно, удаление оригинала иногда освобождает память, используемую клоном, и выдает ошибку, когда вызывающая сторона пытается используйте его.
С другой стороны, если я не утилизирую оригинал, я не уверен, что утилизация клона также удалит все, что необходимо удалить в оригинале. Я ничего не нашел в документации, и, глядя на исходный код, я вижу, что он вызывает некоторые нативные методы, которые я понятия не имею, что они делают.