Как программно редактировать .png?

У меня есть 28 изображений, каждое из которых имеет 3 размера (всего 84), все они монохромные с разными альфа-слоями для создания каждого изображения. Я хочу сделать каждый из них доступным в 5 разных цветах. всего будет 420 изображений. Это, очевидно, было бы огромной болью, чтобы сделать это вручную. У меня нет Photoshop, поэтому любой тип функции Photoshop не является допустимым ответом. У меня есть Paint.NET, но настройка оттенка не работает для меня, потому что изменение оттенка само по себе не дает мне нужных цветов.

По сути, мне нужно для каждого пикселя изображения взять значение RGBA и заменить RGB новым значением RGB, сохранив то же значение A.

Кто-нибудь знает, как это сделать? Мне не повезло с поиском в StackOverflow или Google (вероятно, я использовал неправильные условия поиска).

Я бы предпочел ответ на C# или VB.NET, но если кто-нибудь знает, как это сделать на любом языке, возможно, я смогу применить его к C# или VB.NET.

--Редактировать--

Если кто-то нашел это и ищет ответ, вот что я получил по ссылке от Йори Натана.

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;
}
6
задан Nick 26 March 2012 в 02:42
поделиться