如何使用编程的方式编辑.png文件?

7
我有28张图像,每张图像有3种大小(共84个),都是单色的,并带有不同的alpha层来制作每个图像。我想让它们中的每一个以5种不同的颜色可用。总共会有420个图像。这显然是手动完成的巨大痛苦。我没有Photoshop,因此任何类型的Photoshop功能都不是有效的答案。我有Paint.NET,但是调整色相对我来说不起作用,因为仅更改色相不能给出我想要的颜色。
基本上,我需要为图像中的每个像素,取出RGBA值并替换RGB值,并保持相同的A值。
有人知道怎么做吗?我在StackOverflow或Google上没有找到有用的结果(可能使用了错误的搜索术语)。
我希望得到C#或VB.NET的答案,但如果有人知道如何使用任何语言来解决此问题,也许我可以将其应用于C#或VB.NET。
--编辑--
以防有人找到这篇文章并正在寻找答案,以下是基于Yorye Nathan的链接得出的答案。
private const int RED = 51;
private const int GREEN = 181;
private const int BLUE = 229;

private const int NEW_RED = 170;
private const int NEW_GREEN = 102;
private const int NEW_BLUE = 204;

private void Form1_Load(object sender, EventArgs e)
{
  if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
  {

    Image OriginalImage = Image.FromFile(openFileDialog1.FileName);
    Image NewImage = ColorFilter(OriginalImage);

    pictureBox1.Image = OriginalImage;
    pictureBox2.Image = NewImage;
  }

}

public static Image ColorFilter(Image originalImage)
{
  Bitmap newImage = new Bitmap(originalImage);
  BitmapData originalData = (originalImage as Bitmap).LockBits(new Rectangle(0, 0, originalImage.Width, originalImage.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

  BitmapData newData = (newImage as Bitmap).LockBits(new Rectangle(0, 0, originalImage.Width, originalImage.Height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);

  int originalStride = originalData.Stride;
  System.IntPtr originalScan0 = originalData.Scan0;

  int newStride = newData.Stride;
  System.IntPtr newScan0 = newData.Scan0;

  unsafe
  {
    byte* pOriginal = (byte*)(void*)originalScan0;
    byte* pNew = (byte*)(void*)newScan0;

    int nOffset = originalStride - originalImage.Width * 4;

    byte red, green, blue;

    for (int y = 0; y < originalImage.Height; ++y)
    {
      for (int x = 0; x < originalImage.Width; ++x)
      {
        blue = pOriginal[0];
        green = pOriginal[1];
        red = pOriginal[2];

        if (pOriginal[0] == BLUE && pOriginal[1] == GREEN && pOriginal[2] == RED)
        {
          pNew[0] = (byte)NEW_BLUE;
          pNew[1] = (byte)NEW_GREEN;
          pNew[2] = (byte)NEW_RED;
        }

        pOriginal += 4;
        pNew += 4;
      }
      pOriginal += nOffset;
      pNew += nOffset;
    }
  }
  (originalImage as Bitmap).UnlockBits(originalData);
  (newImage as Bitmap).UnlockBits(newData);
  return newImage;
}

1
我运行了那段代码(稍作修改,比如循环遍历所选目录中的所有图像并更改输出路径),在不到一秒钟的时间内生成了全部420张图片。手工劳动是给傻瓜准备的。 - Nick
可能是将颜色滤镜应用于位图对象的重复问题。 - TylerH
1个回答

4

查看这个问题。稍微调整一下像素的位替换方式,使其相加而不是替换,就可以了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接