Хорошо, вопрос не очень точный. Измеряется ли увеличение относительно начального потребления памяти или относительно точки, где используются первые 140 МБ? А у сборщика мусора есть шанс бежать? ОП должен уточнить это.
даю слишком большого потребления памяти при преобразовании TransformedBitmap в System.Drawing.Bitmap. Изображение довольно большое с 7360x4912 пикселей с пиксельным форматом BGR32, который добавляет до 144609280 битов ~ 138 МБ.
Сначала я загружаю изображение с жесткого диска в BitmapImage. Затем поверните его с помощью RotateTransform, чтобы получить окончательный вариант TransformedBitmap (WPF).
Для обработки изображений с EmguCV мне понадобится System.Drawing.Bitmap. Я конвертирую TransformedBitmap, используя следующую функцию:
Private Function convertToBitmap(tb As TransformedBitmap) As System.Drawing.Bitmap
Dim myBitmap As New System.Drawing.Bitmap(tb.PixelWidth, tb.PixelHeight, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
'140mb increase'
Dim data As System.Drawing.Imaging.BitmapData =
myBitmap.LockBits(New System.Drawing.Rectangle(System.Drawing.Point.Empty, myBitmap.Size),
System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb)
tb.CopyPixels(Int32Rect.Empty, data.Scan0, data.Height * data.Stride, data.Stride)
'another 140MB increase'
myBitmap.UnlockBits(data)
Return myBitmap
End Function
Загрузка TransformedBitmap занимает около 140 МБ, как и ожидалось. После преобразования TransformedBitmap в Bitmap с использованием упомянутой функции я могу обнаружить увеличение на 276 МБ, что в два раза больше размера самого изображения.
Есть ли у вас какие-либо понятия о том, чего мне не хватает? Я хочу сохранить Transformmed Bitmap, а также преобразованный Bitmap, но не более того.
заранее спасибо
РЕДАКТИРОВАТЬ:
Вот код вызова с комментариями к памяти:
Dim tb As New TransformedBitmap()
' Create the source to use as the tb source.
Dim bi As New BitmapImage()
bi.BeginInit()
bi.UriSource = New Uri(Image_Path, UriKind.Absolute)
bi.CacheOption = BitmapCacheOption.OnLoad
bi.EndInit()
' Properties must be set between BeginInit and EndInit calls.
tb.BeginInit()
tb.Source = bi
' Set image rotation.
Dim transform As New RotateTransform(angle)
tb.Transform = transform
tb.EndInit()
' Set the Image source.
imgChurch.Source = tb
' load the Image for OpenCV too
_cvImage?.Dispose()
'memory around 177MB
Dim bmp As System.Drawing.Bitmap = convertToBitmap(tb) 'Memory is after
'Call about 454MB
_cvImage = New CVImage(bmp)
bmp.Dispose()
GC.Collect()
CVImage Class - это оболочка для EmguCV lib.
public CVImage(Bitmap bmp)
{
var img = new Image<Bgr, byte>(bmp);
currentImg = img.Mat;
}