2017-04-24 4 views
2

x = arround 5000、y = arround 13の値を持つMatrix [y] [x]を持っています。 そして私はそれらをイメージ上の異なる色(値によって異なる)にマークする必要があります。C# - イメージのピクセルのマーキング

問題:画像がマトリックスよりもはるかに大きいです。 1つの値のiカラー1ピクセルの場合、Xの1/3しか得られず、yの1/20のように塗りつぶされます。しかし、私は持っている価値の量で全体のイメージをペイントする必要があります。私が試した

ソリューション:各値 問題で一度に複数のピクセルをマーキング:私は同時にXとYをスケーリングすることはできません - 私のために複雑に>道:私は考えることができます/

ソリューション:スケーリング画像をマトリックスの正確なサイズに合わせてから、ピクセル(1ピクセル= 1の値)をペイントし、その後、描画されたイメージのサイズを表示サイズに変更します。

私がここで助けてくれたら嬉しいです。多分あなたはこの問題のためのより良い解決策を持っています。私は考えることができるよりも...注:私はC#でnewbyです。

私の現在の試み:(行列の各値に5つのピクセルをマーキング)事前に

Bitmap image1; 
      image1 = new Bitmap(@"C:\Users\Downloads\test.bmp", true); 


      Bitmap newImage = new Bitmap(image1.Width, image1.Height); 
      using (Graphics graphics = Graphics.FromImage(newImage)) 
      { 
       graphics.DrawImage(image1, 0, 0); 
      } 



      Color pixelColor = newImage.GetPixel(0, 0); //set pixel color to white 
      int x, y; //loop for matrix 
      double akt_Wert = 0; 

      int x1=0, y1=0; //loop for picture 
      for (x = 0; x < max_Col; x++) /
      { 

       for (y = max_Rows - 1; y >= 0; y--) 
       { 

        try 
        { 

         akt_Wert = Convert.ToDouble(rows[y][x]); //tries to convert the current Value to double, if it fails its NaN -> catch 


         if (akt_Wert < 0.7) //if < threshold 
         { 
          for (x1 = x * 5; x1 < x*5+5; x1++) 
          { 
           Color newColor = Color.FromArgb(pixelColor.R, 50, 50); 
           newImage.SetPixel(x1, y1, newColor); 
          } 

         } 

         if (akt_Wert >= 0.7) //if >= threshold 
         { 
          for (x1 = x * 5; x1 < x*5+5; x1++) 
          { 
           Color newColor = Color.FromArgb(pixelColor.B, 10, 0); 
           newImage.SetPixel(x, y, newColor); 
          } 

         } 

        } 

        catch //value is NaN 
        { 
         //MessageBox.Show("Spalte = NaN"); 

        } 


       } 


      pictureBox1.Image = newImage;  // Set the PictureBox to display the image.    
      System.Threading.Thread.Sleep(5); //needed to avoid error 

     } 

        } 

ありがとう! よろしくお願いいたします。 キリスト教

+0

_Iは、同時にXとYをスケールすることができません - >私のために複雑になる方法??????ハァッ??あなたがxをスケールすることができれば、yと同じことをする別のものは何ですか? FillRectanlgeのSizeFと座標を決定するために、浮動小数点数を使って作業するだけです。 – TaW

答えて

1

ここは例です。

整数除算によるデータ損失を避けるため、floatsの使用に注意してください。

はまた、あなたが実際にあなたが使用できる新しい画像を作成する場合は、我々は..

enter image description here

Bitmap b = (Bitmap)Image.FromFile(fileName); 

// the data array sizes: 
int numX = 3000; 
int numY = 30; 
int[,] data = new int[numX, numY]; 

// create test data: 
Random rnd = new Random(8); 
for (int i = 0; i < data.GetLength(0); i++) 
    for (int j = 0; j < data.GetLength(1); j++) 
      data[i, j] = rnd.Next(123456); 

// scale the tile size: 
float sx = 1f * b.Width/data.GetLength(0); 
float sy = 1f * b.Height/data.GetLength(1); 

// now fill the tile-pixels 
using (Graphics g = Graphics.FromImage(b)) 
{ 
    for (int x = 0; x < data.GetLength(0); x++) 
     for (int y = 0; y < data.GetLength(1); y++) 
     { 
      RectangleF r = new RectangleF(x * sx, y* sy, sx, sy); 
      Color c = Color.FromArgb(99, Color.FromArgb(data[x, y])); 
      using (SolidBrush brush = new SolidBrush(c)) 
       g.FillRectangle(brush, r); 
     } 
    // display or save or whatever.. 
    pictureBox1.Image = b; 
} 

て、元の画像の輝きを見ることができるので、私は半透明のブラシの色を作成することに注意してくださいg.Clear(someColor)を押して背景色を設定します。もちろん、ファイルからではなくゼロから作成します:Bitmap b = new Bitmap(1234,1234);;ここに特別なPixelFormat設定を含めることができます。

+0

素早くお答えいただきありがとうございます!ほんとうにありがとう! しかし、質問があります。私は完全にコードを理解していません。 1.配列サイズをデータ[numX、numY]に格納します。 2. "numXに数えます"と "jにnumY " 3.データ[i、j] = rnd.Next(123456);これは何ですか? 4.タイルサイズのスケール - >これは "ピクセル"の新しいサイズです(1アレイ値= 1タイル右ですか?) 5.タイルピクチャをランダムなクラウドで塗りつぶしますか? 私は自分のイメージでテストしましたが、問題はイメージです。サイズは以前よりもはるかに大きくなりました。私はイメージの一部しか見ません。 ありがとうございました – christian890

+0

1,2&4:はい。 3&5:はい、これは、(繰り返し可能な)ランダムな色の(シードされた)ランダムジェネレータを作成します。 - ビットマップの結果のサイズは、私がすでに持っている領域に描画するだけで変わるべきではありません。 PictureBoxですべての画像を表示させるには、SizeModeをZoom(またはStretch)に設定してください! – TaW

+0

ああ私はそれを得た!あなたにすっごくありがとう!本当に本当に私を助けました!私はあなたに素晴らしい一日をお祈りしています!ありがとう – christian890

関連する問題