0

私はいくつかの画像処理が必要なWinRTアプリを開発しています。 私はWriteableBitmapexを使用しています。画像の楕円上の特定のピクセルの色を変更しようとしています。 私の解決策は非常に遅いです。画像をタップして数分後。 なぜこのソリューションが遅いですか?何が別の方法ですか?WinRTアプリケーションで高速画像処理を行う方法は?

private void myimage_Tapped(object sender, TappedRoutedEventArgs e) 
{ 
    var xcor = e.GetPosition(sender as UIElement).X; 
    var ycor = e.GetPosition(sender as UIElement).Y; 
    Image ws = sender as Image; 

    int x = (int)(imag.PixelWidth * xcor/ws.ActualWidth); 
    int y = (int)(imag.PixelHeight * ycor/ws.ActualHeight); 
    var color = imag.GetPixel(x, y); 
    if (color.B != 0 && color.G != 0 && color.R != 0) 
    { 
     while (color.B != 0 && color.G != 0 && color.R != 0 && x < imag.PixelWidth) 
     { 
      x = x+1; 
      y = (int)(imag.PixelHeight * ycor/ws.ActualHeight); 
      while (color.B != 0 && color.G != 0 && color.R != 0 && y < imag.PixelHeight) 
      { 
       y = y + 1; 
       color = imag.GetPixel(x, y); 
       imag.SetPixel(x, y, Colors.Red); 
      } 

     } 
    } 
} 
+0

あなたがXCOR、ycorに格納座標は何ですか? その楕円は何ですか? ピクセルが黒いときにwhilesを停止するのはなぜですか? – Piglet

+0

@ピグレット楕円の色を変更するには、ストロークの色が黒で、xcorは楕円をクリックするようにしてください –

答えて

2
  1. 使用BitmapContextSet/GetPixelがあるため実際にあなたがそれらを呼び出すたびに、彼らは正直にそれがいずれかを行いませんのでBitmapContext

  2. レビューあなたのロジックを開く/閉じる、非常に非常に遅いです私に感謝するか、あなたが達成しようとしていることを説明する

は、ここではいくつかのヘルパーに沿って、コンテキストを使用する方法の例です:

var bitmap = BitmapFactory.New(2048, 2048); 
using (var context = bitmap.GetBitmapContext(ReadWriteMode.ReadWrite)) 
{ 
    Func<int, int, int> getPixel = (x, y) => 
    { 
     var offset = y*bitmap.PixelWidth + x; 
     return offset; 
    }; 

    Action<int, int, int> setPixel = (x, y, c) => 
    { 
     var offset = getPixel(x, y); 
     context.Pixels[offset] = c; 
    }; 

    Func<Color, int> toInt32 = c => 
    { 
     var i = c.A << 24 | c.R << 16 | c.G << 8 | c.B; 
     return i; 
    }; 
    for (var y = 0; y < bitmap.PixelHeight; y++) 
    { 
     for (var x = 0; x < bitmap.PixelHeight; x++) 
     { 
      var color = Color.FromArgb(
       255, 
       (byte) ((float) x/bitmap.PixelWidth*255), 
       (byte) ((float) y/bitmap.PixelHeight*255), 
       255); 
      var int32 = toInt32(color); 
      setPixel(x, y, int32); 
     } 
    } 
} 
+0

は、Microsoftペイントで使用されているのと同じ手順ですか?私は、MSのペイントアプリケーションで消しゴムや塗りつぶしのような牽引ツールを作成しようとする。しかし、私はこのメソッドを使うか、グラフィックオブジェクトを使うのが良い方法なのか理解する必要がありますか?この方法では、塗りつぶしツールを作成することはできましたが、グラフィックメソッドでは消しゴムを作成することができました。どのようにしてこのツールをイメージ用に使うことができますか? –

関連する問題