2017-08-02 11 views
-1

イメージを読み込んで、RGB値のすべてのピクセルの法線ベクトルを計算するコードを書きました。問題は256x256イメージを選択しても、C#が動作するには時間がかかり、時にはシャットダウンすることになります。誰かが私に別の方法や別の解決策を見せてもらえますか?法線マップの効率をどのように読み取ることができますか?

コード:

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Diagnostics; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 

namespace Aufgabe17NormalMapping 
{ 
public partial class Form1 : Form 
{ 
    public delegate void TextManagerDelegate(string text); 
    TextManagerDelegate TextHandler; 

    Bitmap img; 

    public Form1() 
    { 
     InitializeComponent(); 
     TextHandler = new TextManagerDelegate(TextManager); 

    } 


    public void TextManager(string txt) 
    { 
     textBox1.AppendText(txt + Environment.NewLine); 
    } 
    public void RunProcess() 
    { 
     string filePath = @"C:\Users\USerName\Documents\Visual Studio 2017\Projects\Aufgabe17NormalMapping\images.jpg"; 
     using (img = new Bitmap(filePath)) 
     { 
      var height = img.Height; 
      var width = img.Width; 
      double[,] ArrayR = new double[width, height]; 
      double[,] ArrayG = new double[width, height]; 
      double[,] ArrayB = new double[width, height]; 


      for (int i = 0; i < width; i++) 
      { 
       for (int j = 0; j < height; j++) 
       { 
        Color pixel = img.GetPixel(i, j); 
        ArrayR[i, j] = (((double)Convert.ToDouble(pixel.R.ToString())) + 0.5) * 2; 
        ArrayG[i, j] = (((double)Convert.ToDouble(pixel.G.ToString())) + 0.5) * 2; 
        ArrayB[i, j] = (((double)Convert.ToDouble(pixel.B.ToString())) + 0.5) * 2; 
        Debug.WriteLine(ArrayR[i, j].ToString(), "Array R"); 
        //Debug.Print(ArrayR[i, j].ToString(), "Array Rsdsd"); 
        BeginInvoke(TextHandler, ArrayR[i, j].ToString()); 


       } 
      } 

     } 
    } 
    private void button1_Click(object sender, EventArgs e) 
    { 
     Task T = new Task(RunProcess); 
     T.Start(); 
    } 

} 

}

+0

シャットダウンとはどういう意味ですか?あなたの質問には、回答の詳細が必要です。 – xxbbcc

+0

全体のC#プログラムがフリーズし、操作が長すぎるためにC#がもう動作しないというメッセージが表示されます –

+0

@VladimirChudnofskyなぜあなたは 'ArrayR'などが必要ですか?あなたの質問から、私はこの配列は単なる一時オブジェクトであることがわかります。 –

答えて

1

あなたのコードは本当に速いです、それは長い時間がかかる "報告" です。削除Debug.WriteLineTextHandlerと私が得た(デバッグモードで)以下の時間

ImgSize 532x1280 
Lasted: 0:00:01,181845 

コードスニペット:

static void Main(string[] args) 
{ 
    var watch = Stopwatch.StartNew(); 
    RunProcess(); 
    Console.WriteLine($"Lasted: {watch.Elapsed.ToString("g")}"); 
} 

public static void RunProcess() 
{ 
    var str = new StringBuilder(); 
    string filePath = @"C:\Users\Wouter\Desktop\gamez.jpg"; 
    using (var img = new Bitmap(filePath)) 
    { 
     var height = img.Height; 
     var width = img.Width; 
     Console.WriteLine($"ImgSize {width}x{height}"); 

     double[,] ArrayR = new double[width, height]; 
     double[,] ArrayG = new double[width, height]; 
     double[,] ArrayB = new double[width, height]; 

     for (int i = 0; i < width; i++) 
     { 
      for (int j = 0; j < height; j++) 
      { 
       Color pixel = img.GetPixel(i, j); 
       ArrayR[i, j] = (((double)Convert.ToDouble(pixel.R.ToString())) + 0.5) * 2; 
       ArrayG[i, j] = (((double)Convert.ToDouble(pixel.G.ToString())) + 0.5) * 2; 
       ArrayB[i, j] = (((double)Convert.ToDouble(pixel.B.ToString())) + 0.5) * 2; 
       str.AppendLine(ArrayR[i, j].ToString()); 
      } 
     } 
    } 
    BeginInvoke(TextHandler, str.ToString()); 
} 

StringBuilderで作業をしてみて、あなたが持ってたら、画像全体が処理され、更新UIは一度。

+0

'StringBuilder'はどういう意味ですか? 'StringBuilder'の使い方とUIの更新方法を教えてください。 –

+0

が更新されました。 'File.WriteAllText(@" colors.txt "、str.ToString());'を使用すると、532x1280イメージでは1.5秒かかりました。 (68k行) – Laoujin

+0

@VladimirChudnofsky @Laoujinはあなたに良いヒントを与えました。使用方法を尋ねる前に、あなた自身が 'StringBuilders'を参照するべきだと思います。 – Tipx

関連する問題