2016-10-02 6 views
2

에 WriteableBitmap 이미지 ToArray 변환. 나는 이미지의 uri를 반환하고 시도하고 다운로드 할 HttpClient를 사용하고 있습니다. uri이 올바른 것으로 확인되었습니다. 나는 나의 푸른 서비스에 BLOB 저장소에서 이미지를 액세스하고 UWP

using (HttpClient client = new HttpClient()) 
{ 
    try 
    { 
     HttpResponseMessage response = await client.GetAsync(new Uri(((App)Application.Current).results.statsInformation.ImageBlob.ImageUri, UriKind.RelativeOrAbsolute)); 
     if (response != null && response.StatusCode == HttpStatusCode.OK) 
     { 
      using (var stream = await response.Content.ReadAsStreamAsync()) 
      { 
        using (var memStream = new MemoryStream()) 
        { 
         await stream.CopyToAsync(memStream); 
         memStream.Position = 0; 
         memStream.Seek(0, SeekOrigin.Begin); 
         myOnlineImage.SetSource(memStream.AsRandomAccessStream()); 
        } 
       } 
     } 
    } 
    catch (Exception) 
    { 
     throw; 
    } 
} 

서버로부터 화상 ​​

myOnlineImage 변수에 저장된다. 그런 다음 myOnlineImage.PixelBuffer.ToArray();을 사용하여 픽셀 정보를 추출하고 싶습니다. 이미지가 제대로 다운로드되지 않았기 때문입니까? 누구든지이 문제를 해결할 수있는 옵션을 도울 수 있습니까?

내가 수신하고 예외입니다 :

예외

메시지 ". 값은 null 일 수 없습니다 \ 연구 \ 이름 nParameter : 소스"System.Runtime에서

스택 트레이스 " .InteropServices.Marshal.CopyToManaged (소스를 IntPtr 오브젝트 대상에서 startIndex INT32, INT32 길이) \ R \ n System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.CopyTo (IBuffer 소스 UINT32 sourceIndex 바이트 [] 목적지에서 INT32 destinationIndex, INT32 카운트) \ R \ n System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArray (IBuffer 소스 UINT32 sourceIndex, INT32 카운트)에서 \ R \ n System.Runtime.InteropServices.WindowsRuntime.WindowsRuntimeBufferExtensions.ToArray에서 (소스 IBuffer) \ Stonegaard_endless_runner.MainPage.d__7.MoveNext에서 연구 \ n을() "

나는 이미지에 스레드 액세스 권한이 있는지 확인했다

추가.

답변

1

경우에 따라 System.Runtime.InteropServices을 사용할 수 없습니다. 포인터 myOnlineImage.PixelBuffer은 null입니다. 당신은 BitmapImage하지만 WriteableBitmap를 사용하여 MSDN의 예처럼 BitmapDecoder, BitmapFrame, PixelDataProviderbyte[]로 변환 할 수 있습니다

 byte[] image_array = null; 
     int image_array_width = 0; 
     int image_array_height = 0; 

     using (HttpClient client = new HttpClient()) 
     { 
      try 
      { 
       HttpResponseMessage response = await client.GetAsync(new Uri("http://www.example.com/logo.png", UriKind.RelativeOrAbsolute)); 
       if (response != null && response.StatusCode == HttpStatusCode.OK) 
       { 
        using (Stream stream = await (response.Content.ReadAsStreamAsync())) 
        { 
         using (IRandomAccessStream strm = stream.AsRandomAccessStream()) 
         { 
          strm.Seek(0); 
          BitmapDecoder decoder = await BitmapDecoder.CreateAsync(strm); 
          BitmapFrame bitmapFrame = await decoder.GetFrameAsync(0); 
          // Get the pixels 
          var transform = new BitmapTransform { ScaledWidth = decoder.PixelWidth, ScaledHeight = decoder.PixelHeight }; 
          PixelDataProvider dataProvider = 
          await bitmapFrame.GetPixelDataAsync(BitmapPixelFormat.Bgra8, 
                    BitmapAlphaMode.Straight, 
                    transform, 
                    ExifOrientationMode.RespectExifOrientation, 
                    ColorManagementMode.ColorManageToSRgb); 

          await strm.FlushAsync(); 
          image_array = dataProvider.DetachPixelData(); 
          image_array_width = (int)decoder.PixelWidth; 
          image_array_height = (int)decoder.PixelHeight; 
          } 
        } 
       } 
      } 
      catch (Exception) 
      { 
       throw; 
      } 
     } 
+0

이미지 파일이 아니라 서버에서 또는 다른 bitmapImage에서. 코드를 테스트하기 위해 변환 방법을 아는 변경 사항이 있습니까? – JTIM

+0

@JTIM using을 사용하여 파일을 다음과 같이 바꿉니다. using (Stream stream = await (response.Content.ReadAsStreamAsync())) {using (IRandomAccessStream strm = stream.AsRandomAccessStream()) {... –

+0

'bi.SetSource (strm)'라인이 실행된다. 그 후 아무 일도 일어나지 않아? – JTIM