【问题标题】:How can I save the location of every single pixel of my image in c#?如何在 c# 中保存图像的每个像素的位置?
【发布时间】:2018-08-11 14:06:58
【问题描述】:

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

【问题讨论】:

  • 这都是什么废话?我假设您有一些构建错误,是吗?首先修复它们,如果您需要帮助,然后将特定错误添加到您的问题中
  • 很好 - 你甚至没有试图变得被动积极:-D

标签: c# image pixel


【解决方案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 个像素,此代码将永远循环。

【讨论】:

  • 我的图像实际上只有黑白颜色。我需要做的是识别我的图像(前景)的黑色区域,然后例如随机关闭 300 像素的黑色像素并保存 pout put 图像。
  • 请定义“关闭像素”的含义。黑色像素是黑色像素,白色是白色,什么是关闭像素?
  • 我的意思是把黑色像素变成白色。
【解决方案2】:

下面会打开一张图片到内存中,然后将像素数据复制到一个二维数组中。然后它将二维数组中的 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");

【讨论】:

  • 如果你解释你的代码是做什么的,它会极大地帮助人们。
  • @Thorsten 它按照他的要求做。它也有 cmets。
  • 我知道,我只是想说,在没有解释的情况下,仅发布代码有时并不是一个好的解决方案。
  • 没问题。我添加了一些解释。
  • 你能告诉我“List Used = new List();”是什么意思吗?做什么?
猜你喜欢
  • 1970-01-01
  • 2019-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-19
  • 1970-01-01
  • 2022-11-26
  • 2011-07-31
相关资源
最近更新 更多