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

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

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

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

Я бы предпочел ответ на С# или VB.NET, но если кто-нибудь знает, как это сделать на любом языке, возможно, я смогу применить его к С# или 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;
}

person Nick    schedule 26.03.2012    source источник
comment
Я запустил этот код (с некоторыми изменениями, такими как перебор всех изображений в выбранном каталоге и изменение выходного пути) и сгенерировал все 420 изображений менее чем за секунду. Ручной труд для лохов.   -  person Nick    schedule 26.03.2012
comment
Возможный дубликат применения цветового фильтра к объекту Bitmap   -  person TylerH    schedule 27.08.2019


Ответы (1)


Проверьте этот вопрос. Немного подправьте замену битов пикселей, чтобы они добавлялись, а не заменялись, и все готово.

person SimpleVar    schedule 26.03.2012