2011-01-23 2 views
2

ValueConverter에서 System.Data.Linq.Binary (SQL CE 이미지)을 BitmapImage으로 변환하려고했습니다. 이 방법은 (이미지 쇼 형태에 제대로입니다) 작동 :왜 SQL CE에서 WPF 이미지로 이미지를로드하는 두 가지 방법으로 다른 결과가 나옵니까?

public object Convert(object value, Type targetType, object parameter, 
                CultureInfo culture) { 
    Binary binary = value as Binary; 
    if (binary != null) { 
     BitmapImage bitmap = new BitmapImage(); 
     bitmap.BeginInit(); 
     bitmap.StreamSource = new MemoryStream(binary.ToArray()); 
     bitmap.EndInit(); 
     return bitmap; 
    } 
    return null; 
} 

이 방법을 수행 하지 일 (그러나 예외는, 이상하게도 발생하지 않습니다) :

public object Convert(object value, Type targetType, object parameter, 
                CultureInfo culture) { 
    Binary binary = value as Binary; 
    if (binary != null) { 
     using (var stream = new MemoryStream(binary.ToArray())) { 
      BitmapImage bitmap = new BitmapImage(); 
      bitmap.BeginInit(); 
      bitmap.StreamSource = stream; 
      bitmap.EndInit(); 
      return bitmap; 
     } 
    } 
    return null; 
} 

좋은 프로그래밍 연습 상태를 당신 내가 만든 모든 스트림을 처리해야합니다 ... 그래서 두 번째 방법이 작동하지 않는 이유는 혼란 스럽지만 첫 번째 방법은 혼란 스럽습니다. 어떤 통찰력?

+0

여기 간단한 샘플 코드가 있습니다. http://erikej.blogspot.com/2009/11/how-to-save-and-retrieve-images-using.html – ErikEJ

+0

바이트 []에서 이미지 'Image.FromStream (ms);을 사용합니다. 이것은 Windows Forms에만 해당됩니다 (저는 WPF를 사용하고 있습니다). 'System.Windows.Media.Imaging.BitmapImage'와'System.Windows.Controls.Image'를 체크했는데 둘 다'FromStream' 메서드를 가지고 있지 않았습니다. 링크를 가져 주셔서 감사합니다. – Pwninstein

답변

2

대신을 시도해보십시오

public object Convert(object value, Type targetType, object parameter, 
                CultureInfo culture) { 
    Binary binary = value as Binary; 
    if (binary != null) { 
     using (var stream = new MemoryStream(binary.ToArray())) { 
      BitmapImage bitmap = new BitmapImage(); 
      bitmap.BeginInit(); 
      bitmap.CacheOption = BitmapCacheOption.OnLoad; 
      bitmap.StreamSource = stream; 
      bitmap.EndInit(); 
      bitmap.Freeze(); 
      return bitmap; 
     } 
    } 
    return null; 
} 

을 당신이 아닌 작업 버전에서는, 당신의 using 블록은 스트림 이미지가 실제 디코딩 전에 폐쇄을 의미합니다.

+0

나는 이것을 시험해 볼 것이다, 고마워! – Pwninstein

0

내 생각에 MemoryStream을 처분 할 때 비트 맵의 ​​StreamSource이 무효화됩니다. 따라서 비트 맵이 렌더링을 시도 할 때 사용할 수있는 유효한 데이터가 없습니다.

+0

하지만 그는'MemoryStream'이 처리되기 전에 비트 맵을 반환합니다, 그렇죠? – VoodooChild

+0

@VoodooChild, 좋은 지적이지만 가능합니까? WPF는'Dispose()'가 호출 될 때까지 실제로 비트 맵을 렌더링하려고하지 않습니다. – devuxer