.net 如何在C#中手动读取PNG图像文件并操作像素?

k7fdbhmy  于 2023-04-22  发布在  .NET
关注(0)|答案(3)|浏览(441)

已经有很多.NET提供的类和函数来处理包括PNG在内的图像。比如Image, Bitmap, etc. classes。假设,我不想使用这些类。
如果我想手动读取/写入PNG图像作为一个二进制文件与像素工作,那么我该怎么做呢?

using(FileStream fr = new FileStream(fileName, FileMode.Open)) 
{
      using (BinaryReader br = new BinaryReader(fr))
      {
          imagesBytes= br.ReadBytes((int)fr.Length);
      }  
}

我怎样才能获得单个像素来操作它们?

zsohkypk

zsohkypk1#

最简单的方法是使用ReadAllBytesWriteAllBytes函数:

byte[] imageBytes = File.ReadAllBytes("D:\\yourImagePath.jpg");    // Read
File.WriteAllBytes("D:\\yourImagePath.jpg", imageBytes);           // Write
z31licg0

z31licg02#

将图像转换为byte[]数组:

public byte[] imageToByteArray(System.Drawing.Image imageIn)
{
 MemoryStream ms = new MemoryStream();
 imageIn.Save(ms,System.Drawing.Imaging.ImageFormat.Gif);
 return  ms.ToArray();
}

将byte[]数组转换为Image:

public Image byteArrayToImage(byte[] byteArrayIn)
{
     MemoryStream ms = new MemoryStream(byteArrayIn);
     Image returnImage = Image.FromStream(ms);
     return returnImage;
}

如果您想使用Pixels,请按以下方式操作:

Bitmap bmp = (Bitmap)Image.FromFile(filename);
                Bitmap newBitmap = new Bitmap(bmp.Width, bmp.Height);

                for (int i = 0; i < bmp.Width; i++)
                {
                    for (int j = 0; j < bmp.Height; j++)
                    {
                        var pixel = bmp.GetPixel(i, j);

                        newBitmap.SetPixel(i, j, Color.Red);
                    }
                }
ikfrs5lh

ikfrs5lh3#

虽然现在讨论这个主题可能有点晚了,但我想和大家分享一下,我从这篇文章中得到了启发,并用C#编写了自己的程序来访问PNG图像的像素。
但是,与BMP格式不同,PNG文件中的像素是用不同的算法压缩的,以减少其大小。我花了几个月的时间去浏览维基百科关于这个主题的文档,我必须承认我被信息淹没了,放弃了一段时间。
有了.NET Core,我建议你去看看一些在线存储库或库,以弄清楚如何访问PNG文件中的像素。因为有这么多的库是用来在服务器中存储图像的。所以它们将是一个读取像素数组的库。
因此,对于初学者,您需要读取打开图像作为流。

using (var reader = File.OpenRead(inputFile))
{
  //code goes here.
}

或者你可以直接把整个图像载入内存

File.ReadAllBytes(inputFile)

然后你需要将它们切片成字节,并将这些切片转换成人类可读的数据。但我建议你首先通过这个Link。了解png文件中的内容。然后编写代码。到目前为止,我已经通过我的旅程了解到你正在寻找的是IDAT头。但真实的的问题是当你必须将其解码成实际像素时。这是因为不同的算法用于压缩。所以祝你好运,如果你继续png阅读和仓库应该给予你一个良好的开端。
或者你可以检查SixLabors.ImageSharp库。

相关问题