2016-06-08 3 views
0

Мне нужно повернуть BitmapImage в оттенки серого, а второй вариант - черный & белый. Тогда мне нужно показать его при просмотре изображения. Решения, которые я основал, предназначены только для окон 8 или старше. Благодарю.Windows phone 8.1 как преобразовать BitmapImage в оттенки серого и черно-белого?

+0

Вы попробовали решение проблемы с окнами 8? что остановило их работу? – BugFinder

+0

Я сделал. В версии 8.1 они удалили много функций из окна телефона 8. На windows phone 8 для преобразования используется bitmapImage.Pixels [pixelLocation]; но на wp 8.1 я получил ошибку "не содержит определения для" Пикселей "" –

ответ

0
 private async void ConvertToGrayScale() 
      { 
       BitmapDecoder decoder = null; 
       BitmapImage bitmapImage = new BitmapImage(new Uri(imageurl, UriKind.RelativeOrAbsolute)); 
       RandomAccessStreamReference rasr = RandomAccessStreamReference.CreateFromUri(bitmapImage.UriSource); 

       using (IRandomAccessStreamWithContentType streamWithContent = await rasr.OpenReadAsync()) 
       { 
        decoder = await BitmapDecoder.CreateAsync(streamWithContent); 

        // Get the first frame 
        BitmapFrame bitmapFrame = await decoder.GetFrameAsync(0); 


        // Get the pixels 
        PixelDataProvider dataProvider = 
         await bitmapFrame.GetPixelDataAsync(BitmapPixelFormat.Bgra8, 
                  BitmapAlphaMode.Premultiplied, 
                  new BitmapTransform(), 
                  ExifOrientationMode.RespectExifOrientation, 
                  ColorManagementMode.ColorManageToSRgb); 

        byte[] pixels = dataProvider.DetachPixelData(); 

        // Create WriteableBitmap and set the pixels 
        WriteableBitmap srcBitmap = new WriteableBitmap((int)bitmapFrame.PixelWidth, 
                   (int)bitmapFrame.PixelHeight); 

        using (Stream pixelStream = srcBitmap.PixelBuffer.AsStream()) 
        { 
         await pixelStream.WriteAsync(pixels, 0, pixels.Length); 
        } 


        byte[] srcPixels = new byte[4 * srcBitmap.PixelWidth * srcBitmap.PixelHeight]; 

        using (Stream pixelStream = srcBitmap.PixelBuffer.AsStream()) 
        { 
         await pixelStream.ReadAsync(srcPixels, 0, srcPixels.Length); 
        } 

        // Create a destination bitmap and pixels array 
        WriteableBitmap dstBitmap = 
          new WriteableBitmap(srcBitmap.PixelWidth, srcBitmap.PixelHeight); 
        byte[] dstPixels = new byte[4 * dstBitmap.PixelWidth * dstBitmap.PixelHeight]; 


        for (int i = 0; i < srcPixels.Length; i += 4) 
        { 
         double b = (double)srcPixels[i]/255.0; 
         double g = (double)srcPixels[i + 1]/255.0; 
         double r = (double)srcPixels[i + 2]/255.0; 

         byte a = srcPixels[i + 3]; 

         double e = (0.21 * r + 0.71 * g + 0.07 * b) * 255; 
         byte f = Convert.ToByte(e); 

         dstPixels[i] = f; 
         dstPixels[i + 1] = f; 
         dstPixels[i + 2] = f; 
         dstPixels[i + 3] = a; 

        } 

        // Move the pixels into the destination bitmap 
        using (Stream pixelStream = dstBitmap.PixelBuffer.AsStream()) 
        { 
         await pixelStream.WriteAsync(dstPixels, 0, dstPixels.Length); 
        } 
        dstBitmap.Invalidate(); 

        // Display the new bitmap 
        image.Source = dstBitmap; 
       } 
      } 
private async void ConvertToBlackAndWhite() 
     { 
      BitmapDecoder decoder = null; 
      BitmapImage bitmapImage = new BitmapImage(new Uri(url, UriKind.RelativeOrAbsolute)); 
      RandomAccessStreamReference rasr = RandomAccessStreamReference.CreateFromUri(bitmapImage.UriSource); 

      using (IRandomAccessStreamWithContentType streamWithContent = await rasr.OpenReadAsync()) 
      { 
       decoder = await BitmapDecoder.CreateAsync(streamWithContent); 

       // Get the first frame 
       BitmapFrame bitmapFrame = await decoder.GetFrameAsync(0); 


       // Get the pixels 
       PixelDataProvider dataProvider = 
        await bitmapFrame.GetPixelDataAsync(BitmapPixelFormat.Bgra8, 
                 BitmapAlphaMode.Premultiplied, 
                 new BitmapTransform(), 
                 ExifOrientationMode.RespectExifOrientation, 
                 ColorManagementMode.ColorManageToSRgb); 

       byte[] pixels = dataProvider.DetachPixelData(); 

       // Create WriteableBitmap and set the pixels 
       WriteableBitmap srcBitmap = new WriteableBitmap((int)bitmapFrame.PixelWidth, 
                  (int)bitmapFrame.PixelHeight); 

       using (Stream pixelStream = srcBitmap.PixelBuffer.AsStream()) 
       { 
        await pixelStream.WriteAsync(pixels, 0, pixels.Length); 
       } 

       byte[] srcPixels = new byte[4 * srcBitmap.PixelWidth * srcBitmap.PixelHeight]; 

       using (Stream pixelStream = srcBitmap.PixelBuffer.AsStream()) 
       { 
        await pixelStream.ReadAsync(srcPixels, 0, srcPixels.Length); 
       } 

       WriteableBitmap dstBitmap = 
         new WriteableBitmap(srcBitmap.PixelWidth, srcBitmap.PixelHeight); 
       byte[] dstPixels = new byte[4 * dstBitmap.PixelWidth * dstBitmap.PixelHeight]; 


       for (int i = 0; i < srcPixels.Length; i += 4) 
       { 
        double b = (double)srcPixels[i]/255.0; 
        double g = (double)srcPixels[i + 1]/255.0; 
        double r = (double)srcPixels[i + 2]/255.0; 

        byte a = srcPixels[i + 3]; 
        int ans = (int)(srcPixels[i] + srcPixels[i+1] + srcPixels[i+2])/3; 
        double e; 
        if (ans <200) 
        { 
         e = 0;//black; 
         byte f = Convert.ToByte(e); 

         dstPixels[i] = f; 
         dstPixels[i + 1] = f; 
         dstPixels[i + 2] = f; 
         dstPixels[i + 3] = a; 
        } 
        else 
        { 
         e = 255;//white 
         byte f = Convert.ToByte(e); 

         dstPixels[i] = f; 
         dstPixels[i + 1] = f; 
         dstPixels[i + 2] = f; 
         dstPixels[i + 3] =a; 
        } 

       } 
       using (Stream pixelStream = dstBitmap.PixelBuffer.AsStream()) 
       { 
        await pixelStream.WriteAsync(dstPixels, 0, dstPixels.Length); 
       } 
       dstBitmap.Invalidate(); 

       // Display the new bitmap 
       image.Source = dstBitmap; 
      } 
     } 
+0

Можете ли вы изменить свой код для работы с BitmapImage img; который не находится на телефоне, потому что я получил ошибку. Когда я делаю снимок и использую ваш метод, он разбился при использовании (IRandomAccessStreamWithContentType streamWithContent = await rasr.OpenReadAsync()) «Метод или операция не реализованы». System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess (задача задачи) в системе .Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification (целевая задача) в System.Runtime.CompilerServices.TaskAwaiter'1.GetResult() в N.EditImage. d__7.MoveNext() –

+0

вы можете разместить свой код? Я не понимаю, что вы говорите. Я использовал BitmapImage – Archana

+0

Im, отправляющий растровый объект из mainPage: protected override void OnNavigatedTo (NavigationEventArgs e) { var obj = App.Current as App; image = obj.ImageToEdit; ImagePreview.Source = image; } И затем ваш метод: BitmapDecoder decoder = null; RandomAccessStreamReference rasr = RandomAccessStreamReference.CreateFromUri (image.UriSource); и сбой: с использованием (IRandomAccessStreamWithContentType streamWithContent = await rasr.OpenReadAsync()) –