我有一个矩阵[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
}
}
提前致谢! 问候 基督教
答案 0 :(得分:1)
这是一个例子。
请注意使用floats
以避免因整数除法而导致数据丢失。
另请注意,我创建了一个半透明的画笔颜色,以便我们可以看到原始图像闪耀..
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
设置。