2010-04-28 4 views
4

.NET 3.5 sp1과 C#을 사용하여 웹에서 비트 맵을로드하는 응용 프로그램을 개발 중입니다.이 WPF 비트 맵로드 예외를 어떻게 catch합니까?

 try { 
      CurrentImage = pics[unChosenPics[index]]; 
      bi = new BitmapImage(CurrentImage.URI); 
      // BitmapImage.UriSource must be in a BeginInit/EndInit block. 
      bi.DownloadCompleted += new EventHandler(bi_DownloadCompleted); 
      AssessmentImage.Source = bi; 
     } 
     catch { 
      System.Console.WriteLine("Something broke during the read!"); 
     } 

및 bi_DownloadCompleted에로드하는 코드는 다음과 같습니다 : 같은

로딩 코드는 보이는 독자를 나누기를 따라

void bi_DownloadCompleted(object sender, EventArgs e) { 
     try { 
      double dpi = 96; 
      int width = bi.PixelWidth; 
      int height = bi.PixelHeight; 

      int stride = width * 4; // 4 bytes per pixel 
      byte[] pixelData = new byte[stride * height]; 
      bi.CopyPixels(pixelData, stride, 0); 

      BitmapSource bmpSource = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Bgra32, null, pixelData, stride); 

      AssessmentImage.Source = bmpSource; 
      Loading.Visibility = Visibility.Hidden; 
      AssessmentImage.Visibility = Visibility.Visible; 
     } 
     catch { 
      System.Console.WriteLine("Exception when viewing bitmap."); 
     } 
    } 

모든 너무 자주, 이미지가 제공됩니다. 나는 그것이 예상된다고 생각한다. 그러나, try/catch 블록 중 하나에 의해 잡히지 않고, 예외는 분명히 내가 처리 할 수있는 곳 밖에서 던져지고있다. this SO question 같은 전역 WPF 예외를 사용하여 처리 할 수 ​​있습니다. 그러나 그것은 내 프로그램의 제어 흐름을 심각하게 엉망으로 만들 것이고, 가능하다면 그것을 피하고 싶습니다.

마이크로 소프트 비트 맵 로더가 기대하는 곳에서 너비/높이 매개 변수가 부족한 것으로 보입니다. 이중 소스 지정을해야합니다. 따라서 첫 번째 과제는 다운로드를 강제하는 것으로 나타나고 두 번째 과제는 dpi/이미지 크기가 제대로 발생하도록합니다.

이 예외를 잡아서 처리하려면 어떻게해야합니까? 당신이 복제하려는 경우

, URI를이 이미지를로드하십시오 :

http://i.pbase.com/o2/26/519326/1/123513540.Yub8hciV.Longford12.jpg 

을 예외 자체는 다음과 같습니다

System.ArgumentException in PresentationCore 
Value does not fall within the expected range. 

내부 예외입니다 :

An invalid character was found in text context. 

스택 추적 :

at MS.Internal.HRESULT.Check(Int32 hr) 
    at System.Windows.Media.Imaging.BitmapFrameDecode.get_ColorContexts() 
    at System.Windows.Media.Imaging.BitmapImage.FinalizeCreation() 
    at System.Windows.Media.Imaging.BitmapImage.OnDownloadCompleted(Object sender, EventArgs e) 
    at System.Windows.Media.UniqueEventHelper.InvokeEvents(Object sender, EventArgs args) 
    at System.Windows.Media.Imaging.LateBoundBitmapDecoder.DownloadCallback(Object arg) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter) 
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
    at System.Windows.Threading.DispatcherOperation.InvokeImpl() 
    at System.Threading.ExecutionContext.runTryCode(Object userData) 
    at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode code, CleanupCode backoutCode, Object userData) 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Windows.Threading.DispatcherOperation.Invoke() 
    at System.Windows.Threading.Dispatcher.ProcessQueue() 
    at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) 
    at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) 
    at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Boolean isSingleParameter) 
    at System.Windows.Threading.ExceptionWrapper.TryCatchWhen(Object source, Delegate callback, Object args, Boolean isSingleParameter, Delegate catchHandler) 
    at System.Windows.Threading.Dispatcher.InvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Boolean isSingleParameter) 
    at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) 
    at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.TranslateAndDispatchMessage(MSG& msg) 
    at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) 
    at System.Windows.Application.RunInternal(Window window) 
    at LensComparison.App.Main() in C:\Users\Mark64\Documents\Visual Studio 2008\Projects\LensComparison\LensComparison\obj\Release\App.g.cs:line 48 
    at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args) 
    at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() 
    at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) 
    at System.Threading.ThreadHelper.ThreadStart() 
+0

Flipr에서 임의의 이미지를 포스터와 유사한 기술을 사용하여로드 할 때 동일한 문제가 발생합니다. –

답변

0

이것은 작동하는 것 같다 :

try 
{ 
    frame = BitmapFrame.Create(new Uri("http://i.pbase.com/o2/26/519326/1/123513540.Yub8hciV.Longford12.jpg")); 
} 
catch 
{ 
    return; 
} 

BitmapFrame이 DecodeFailed 이벤트를 가지고 있지만, 나는 그것이 만들어지는 후 BitmapFrame이 고정되어 있기 때문에 후크 할 수 아니에요.

13

이 예외는 이미지에 포함 된 '깨진'색상 프로파일 정보의 결과입니다. 이 정보를 신경 쓰지 않는다면 (또는 예외 후에 다시 구문 분석을 시도하고 싶다면) BitmapCreateOptions.IgnoreColorProfile 플래그를 사용하십시오.

예 : Scott Hanselman's post을 확인, 자세한 정보를 찾고 있다면

BitmapImage i = new BitmapImage(); 
i.BeginInit(); 
i.CreateOptions |= BitmapCreateOptions.IgnoreColorProfile; 
i.UriSource = new Uri(@"http://www.bing.com/fd/hpk2/KiteFestival_EN-US2111991920.jpg"); 
i.EndInit(); 

. (우리는 오늘이 이슈에 대해 이메일을 통해 모두 의견을 나눴습니다.)

+1

+1 Scott Hanselman의 게시물에 대한 링크는 매우 강력합니다! – David

관련 문제