WPF 그림을 순환적으로 불러와서 메모리가 넘치는 해결 방법

1738 단어
프로그램 장면: 일련의 그림으로 첫 번째부터 마지막 장까지 순서대로 그림을 불러와'애니메이션'을 형성한다.
 
BitmapImage를 생성하는 방법은 다음과 같습니다.
 
1、
var source = new BitmapImage(new Uri(그림 경로, UriKind.xx));
일반적인 장면에서 이런 방법을 사용하는 것은 비교적 편리하고 빠르지만 본 장면에 대해 메모리가 폭발할 것 같다.
 
2、
var data =File.ReadAllBytes(그림 경로);
var ms = new System.IO.MemoryStream(data);var source = new BitmapImage();source.BeginInit();source.CacheOption = BitmapCacheOption.OnLoad;source.StreamSource = ms;source.EndInit();source.Freeze();ms.Close();return source;
이 방법은 기본적으로 실행할 수 있지만, 때로는 고화질 카메라를 호출할 때도 빛이 나지 않을 수도 있다.
고화질의 카메라는 일반적으로 SDK를 제공하여 이미지 데이터byte[]를 얻을 수 있으며 상기 방법을 사용하면 메모리가 넘칠 수도 있다.
다음과 같은 방법으로 시도해 볼 수 있습니다.
//Bitmap으로 변환하면 Bitmap 핸들을 삭제하여 자원 var ms = new System을 해제할 수 있습니다.IO.MemoryStream(data);var bmp = new System.Drawing.Bitmap(ms);var source = ToBitmapSource(bmp);ms.Close();bmp.Dispose();return source;
 
 [DllImport("gdi32.dll", SetLastError = true)]
        private static extern bool DeleteObject(IntPtr hObject);

        private BitmapSource ToBitmapSource(System.Drawing.Bitmap bmp)
        {
            try
            {
                var ptr = bmp.GetHbitmap();
                var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
                    ptr, IntPtr.Zero, Int32Rect.Empty,  System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
                DeleteObject(ptr);
                return source;
            }
            catch
            {
                return null;
            }
        }

 
만약 더 좋은 해결 방법이 있다면, 회답을 환영합니다.

좋은 웹페이지 즐겨찾기