2012-11-16 3 views
1

ImageSource (또는 BitmapSource)을 XML 파일과 함께 저장하고로드하려고합니다. SO에 대한 간단한 살펴보기는 this answer입니다.XML에서 ImageSource (BitmapSource) 저장

잘 보였으므로 시도했지만 이상한 결과가 나타납니다.

BitmapSource testImgSrc = new WriteableBitmap(new BitmapImage(new Uri("pack://application:,,,/MyNameSpace;component/Images/MyImg.png"))); 
BackgroundImage = testImgSrc; 

을하지만이 코드를하려고 할 때 이미지는 전혀 나타나지 않습니다 :

내가하려고하면이 코드의 모든 작동

BitmapSource testImgSrc = new WriteableBitmap(new BitmapImage(new Uri("pack://application:,,,/MyNameSpace;component/Images/MyImg.png"))); 
string testImgStr = ImageToBase64(testImgSrc); 
BitmapSource testImg = Base64ToImage(testImgStr); 
BackgroundImage = testImg; 

는 오류가있을하지 않는 것 또는 예외. BackgroundImage 코드를 실행하면 유효한 이미지 개체로 설정됩니다.

내 WPF 양식의 소스가 BackgroundImage 속성의 결과를 반환하는 속성에 바인딩 된 이미지 컨트롤이 있습니다. 첫 번째 테스트가 예상대로 작동하기 때문에 바인딩이 작동하고 있다고 생각합니다.

두 번째 테스트에서 내 이미지가 표시되지 않는 이유를 이해하는 사람이 있습니까?

답변

4

Base64ToImage 방법에 문제가 있습니다 (this answer). documentation에는 기본값 OnDemand 캐시 옵션을 사용하면 이미지를 실제로 사용하기 전에 스트림을 닫아서는 안됩니다. 귀하의 경우 이것은 Image 요소가 이미 배치 된 스트림에 액세스하려고한다는 것을 의미합니다.

수정 프로그램은, 당신은 단지 OnLoad에 캐시 옵션을 변경하는 매우 간단 필요하고 문제가 사라 :

BitmapSource Base64ToImage(string base64) 
{ 
    byte[] bytes = Convert.FromBase64String(base64); 
    using (var stream = new MemoryStream(bytes)) 
    { 
     return BitmapFrame.Create(stream, BitmapCreateOptions.None, BitmapCacheOption.OnLoad); 
    } 
} 
관련 문제