我正在编写一个程序,我需要将位图图像中每个像素的位置保存在一个数组中,以后需要随机随机关闭300个黑色像素。但是我不知道该怎么做。我写了以下代码,但当然它不起作用。任何人都可以告诉我正确的方法吗?
答案 0 :(得分:1)
每个像素的位置是恒定的(每个像素只有一个x和一个y坐标),因此保存每个像素的位置的要求是模糊的。
我想您尝试做的是:将图像中的300像素变黑,但保存以前的颜色以便恢复单个像素?
你可以试试这个:
class PixelHelper
{
public Point Coordinate;
public Color PixelColor;
}
PixelHelper[] pixelBackup = new PixelHelper[300];
Random r = new Random();
for (int i = 0; i < 300; i++)
{
int xRandom = r.Next(bmp.Width);
int yRandom = r.Next(bmp.Height);
Color c = bmp.GetPixel(xRandom, yRandom);
PixelHelper[i] = new PixelHelper() { Point = new Point(xRandom, yRandom), PixelColor = c };
}
之后,pixelBackup
数组包含300个包含坐标和前一颜色的对象。
编辑:我想从评论中你想要将300个随机黑色像素变为白色,然后再将结果保存为图像?
Random r = new Random();
int n = 0;
while (n < 300)
{
int xRandom = r.Next(bmp.Width);
int yRandom = r.Next(bmp.Height);
if (bmp.GetPixel(xRandom, yRandom) == Color.Black)
{
bmp.SetPixel(xRandom, yRandom, Color.White);
n++;
}
}
bmp.Save(<filename>);
这会将图像中的300个不同像素从黑色变为白色。使用了while
循环,因此只有在遇到黑色像素时才能增加n
。如果随机坐标击中白色像素,则拾取另一个像素。
请注意,如果您的图片总共少于300个像素,此代码将永久循环。
答案 1 :(得分:0)
以下内容将图像打开到内存中,然后将像素数据复制到2d数组中。然后它将2d阵列中的300个像素随机转换为黑色。作为额外的好处,它然后将像素数据保存回位图对象,并将文件保存回磁盘。
我编辑了代码以确保选择了300个不同的像素。
int x = 0, y = 0;
///Get Data
Bitmap myBitmap = new Bitmap("mold.jpg");
Color[,] pixelData = new Color[myBitmap.Width, myBitmap.Height];
for (y = 0; y < myBitmap.Height; y++)
for (x = 0; x < myBitmap.Width; x++)
pixelData[x,y] = myBitmap.GetPixel(x, y);
///Randomly convert 3 pixels to black
Random rand = new Random();
List<Point> Used = new List<Point>();
for (int i = 0; i < 300; i++)
{
x = rand.Next(0, myBitmap.Width);
y = rand.Next(0, myBitmap.Height);
//Ensure we use 300 distinct pixels
while (Used.Contains(new Point(x,y)) || pixelData[x,y] != Color.Black)
{
x = rand.Next(0, myBitmap.Width);
y = rand.Next(0, myBitmap.Height);
}
Used.Add(new Point(x, y)); //Store the pixel we have used
pixelData[x, y] = Color.White;
}
///Save the new image
for (y = 0; y < myBitmap.Height; y++)
for (x = 0; x < myBitmap.Width; x++)
myBitmap.SetPixel(x, y, pixelData[x, y]);
myBitmap.Save("mold2.jpg");