Ho 28 immagini di 3 dimensioni ciascuna (84 totali) tutte monocromatiche con diversi livelli alfa per rendere ogni immagine. Voglio renderli disponibili in 5 colori diversi. quello sarebbe 420 immagini totali. Questo sarebbe ovviamente un enorme dolore da fare manualmente. Non ho Photoshop quindi qualsiasi tipo di funzione di photoshop non è una risposta valida. Ho Paint.NET ma la tonalità di regolazione non funziona per me perché cambiare la tonalità da sola non mi dà i colori che voglio.Come si modifica un file .png a livello di programmazione?
Fondamentalmente quello che devo fare è per ogni pixel dell'immagine, prendere il valore RGBA e sostituire l'RGB con un nuovo valore RGB e mantenere lo stesso valore A.
Qualcuno sa come fare? Non ho avuto fortuna a cercare su StackOverflow o Google (probabilmente usando i termini di ricerca sbagliati).
Preferirei una risposta in C# o VB.NET ma se qualcuno sa come farlo in qualsiasi lingua, forse posso applicarlo a C# o VB.NET.
--Edit--
Nel caso in cui qualcuno trova questo ed è alla ricerca di una risposta, ecco cosa mi sono basati sul collegamento da 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;
}
Ho eseguito quel codice (con alcune modifiche, come il looping di tutte le immagini in una directory selezionata e la modifica del percorso di uscita) e generato tutte le 420 immagini in meno di un secondo. Il lavoro manuale è per i polloni. – Nick