2015-09-27 51 views
1

好吧,我正在嘗試分析WPF應用程序中圖像的啓發式方法。當用戶選擇圖像文件位置時,我想要在代碼隱藏中打開圖像,檢查圖像的顏色並將其輸出到應用程序中。但是,爲了正確檢查圖像的像素,我需要獲取尺寸以將其加載到可以獲得像素顏色的WriteableBitmap使用StorageFile在使用它讀取圖像之前獲取位圖尺寸?

當我第二次打開文件流時,應用程序就會掛起。下面的代碼:

private static async Task<Dictionary<Color, int>> GetColorCountsAsync(string path) 
    { 
     var colorCounts = new Dictionary<Color, int>(); 

     var absolutePath = string.Format(@"{0}\{1}",Directory.GetCurrentDirectory(),path); 

     var dimension = await GetBitmapDimensions(absolutePath); //Method below - opens via StorageFile 

     var file = await StorageFile.GetFileFromPathAsync(absolutePath); //Hangs forever 
     using (var stream = await file.OpenStreamForReadAsync().ConfigureAwait(false)) 
     { 
      var pixelWidth = dimension.Width; 
      var pixelHeight = dimension.Height; 
      var bitmap = new WriteableBitmap(pixelWidth, pixelHeight); 

      bitmap.SetSource(stream.AsRandomAccessStream()); 

      using (var buffer = bitmap.PixelBuffer.AsStream()) 
      { 
       var pixels = new byte[4 * pixelWidth * pixelHeight]; 
       buffer.Read(pixels, 0, pixels.Length); 

       for (var y = 0; y < pixelHeight; y++) 
       { 
        for (var x = 0; x < pixelWidth; x++) 
        { 
         var index = ((y * pixelWidth) + x) * 4; 

         var alpha = pixels[index + 4]; 
         var red = pixels[index + 2]; 
         var green = pixels[index + 1]; 
         var blue = pixels[index + 0]; 
         var color = Color.FromArgb(alpha, red, green, blue); 

         if (!colorCounts.ContainsKey(color)) 
         { 
          colorCounts.Add(color, 0); 
         } 
         colorCounts[color] = colorCounts[color] + 1; 
        } 
       } 
      } 
     } 

     return colorCounts; 
    } 
    private static async Task<Dimension> GetBitmapDimensions(string absolutePath) 
    { 
     var file = await StorageFile.GetFileFromPathAsync(absolutePath); 
     var bitmapImage = new BitmapImage(); 
     using (var fileStream = await file.OpenAsync(FileAccessMode.Read)) 
     { 
      bitmapImage.SetSource(fileStream); 
     } 

     return new Dimension { Height = bitmapImage.PixelHeight, Width = bitmapImage.PixelWidth }; 
    } 

我不能關閉的位圖圖像處理也不是 - 是什麼導致應用程序凍結?

回答

0

由於SetStream()是一種擴展方法,因此不需要正確尺寸的位圖。它只是首先需要一個對象,如下所示:

var bitmap = new WriteableBitmap(1,1).SetSource(stream.AsRandomAccessStream());