2017-04-24 2 views
2

x = arround 5000 및 y = arround 13 값이있는 행렬 [y] [x] 있습니다. 그리고 이미지에 다른 색상 (값에 따라 다름)을 표시해야합니다.C# - 이미지의 픽셀 표시

내 문제 : 이미지가 매트릭스보다 훨씬 큽니다. 1 색 값 1 색의 픽셀 값이 X 값이 1/3이고 y 값이 1/20 인 경우에만 색칠합니다. 하지만 내가 가지고있는 가치의 양으로 전체 이미지를 칠할 필요가있다. > 복잡한에 방법 나를 위해 - 나는 동시에 X와 Y를 확장 할 수 없습니다 :/

솔루션은 내가 생각 할 수 있습니다 스케일링을 각 값 문제로 한 번에 여러 픽셀을 표시 :

솔루션은 내가 시도 이미지를 매트릭스의 정확한 크기에 맞춘 다음 픽셀 (1 픽셀 = 1 값)을 페인팅 한 다음 그 드랍 된 이미지의 크기를 표시된 크기로 조정합니다.

여기에서 나를 도울 수 있다면 좋을 것입니다. 아마도 내가 생각할 수있는 것보다이 문제에 대한 더 나은 해결책을 가지고있을 것입니다. 참고 : 저는 C#에서 newby입니다.

나의 현재의 시도는 : 사전에

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 

     } 

        } 

감사 (행렬의 각 값 5 개 픽셀 표시)! 감사합니다 기독교

+0

_I는 동시에 X 및 Y 축척을 조정할 수 없습니다.> me_ ????? 응? 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