C# - 在图像上标记像素

时间:2017-04-24 09:33:22

标签: c# image-processing matrix

我有一个矩阵[y] [x],其中x = arround 5000,y = arround 13个值。 我需要在图像上用不同的颜色(取决于值)标记它们。

我的问题:图像比矩阵大得多。如果i Color 1 Pixel for 1 Value我只获得1/3的X而且只有1/20 in y painted。但我需要使用我拥有的值来绘制整个图像。

我尝试过的解决方案:使用每个值一次标记多个像素 问题:我无法同时缩放X和Y - >让我感到困惑的方法:/

我可以考虑的解决方案:将图像缩放到矩阵的精确大小,然后绘制像素(1像素= 1值),然后将绘制的图像调整为可见的大小。

如果你能在这里帮助我,那就太好了,也许你对这个问题有一个更好的解决方案,而不是我能想到的......注意:我是C#的新手。

我当前的尝试:(用矩阵的每个值标记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

        }

                   }

提前致谢! 问候 基督教

1 个答案:

答案 0 :(得分: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设置。