如何在c#中保存图像中每个像素的位置?

时间:2014-02-11 13:12:32

标签: c# image pixel

我正在编写一个程序,我需要将位图图像中每个像素的位置保存在一个数组中,以后需要随机随机关闭300个黑色像素。但是我不知道该怎么做。我写了以下代码,但当然它不起作用。任何人都可以告诉我正确的方法吗?

2 个答案:

答案 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");