2012-03-26 15 views
6

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; 
} 
+1

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

risposta

4

Controllare questo question out. Modificalo un po 'con la sostituzione dei bit del pixel per aggiungerli invece di sostituirli, e sei a posto.

+0

Grazie, era esattamente ciò di cui avevo bisogno. Ho aggiornato la domanda e pubblicato la mia soluzione nel caso in cui qualcun altro si imbatta in questa ricerca. – Nick

+0

Ottimo, buona fortuna :) – SimpleVar

Problemi correlati