Tengo 28 imágenes que tienen 3 tamaños cada una (84 en total) que son todas monocromáticas con diferentes capas alfa para hacer cada imagen. Quiero hacer que cada uno de ellos esté disponible en 5 colores diferentes. eso sería 420 imágenes en total. Esto obviamente sería un gran dolor hacerlo manualmente. No tengo Photoshop, así que cualquier tipo de función de Photoshop no es una respuesta válida. Tengo Paint.NET pero el tono de ajuste no funciona para mí porque cambiar el tono por sí solo no me da los colores que quiero.¿Cómo editas un .png programáticamente?
Básicamente lo que tengo que hacer es para cada píxel de la imagen, tomar el valor RGBA y reemplazar el RGB con un nuevo valor RGB y mantener el mismo valor A.
¿Alguien sabe cómo hacer esto? No tuve suerte buscando en StackOverflow o Google (probablemente usando los términos de búsqueda incorrectos).
Preferiría una respuesta en C# o VB.NET, pero si alguien sabe cómo hacer esto en cualquier idioma, tal vez pueda aplicarlo a C# o VB.NET.
--Edit--
En caso de que alguien encuentra esto y está buscando la respuesta, esto es lo que me basé en el enlace de 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;
}
Ejecuté ese código (con algunos ajustes, como recorrer todas las imágenes en un directorio seleccionado y cambiar la ruta de salida) y generé las 420 imágenes en menos de un segundo. El trabajo manual es para los retoños. – Nick