Guide C# – Effetto Sepia in C#

dotnetMolto spesso ci troviamo a lavorare con le immagini quando programmiamo. Abbiamo già visto come salvare le immagini in formato JPEG, come conoscere la loro dimensione prima di salvarle su disco e anche come ottenere l’effetto GrayScale. Vediamo come applicare alle immagini presenti in un Image un effetto particolarmente suggestivo per quanto banale possa risultare: l’effetto sepia.

Rimanendo sull’onda dell’articolo precedente, creiamo una funzione che ci modifichi i pixel secondo alcune regole di cambio colore:


private Color TransformColorToSepia(Color inputColor)
{
int outputRed = (int)((inputColor.R * .393) + (inputColor.G * .769) + (inputColor.B * .189));

int outputGreen = (int)((inputColor.R * .349) + (inputColor.G * .686) + (inputColor.B * .168));

int outputBlue = (int)((inputColor.R * .272) + (inputColor.G * .534) + (inputColor.B * .131));

Color outputColor = Color.FromArgb((outputRed < = 255) ? outputRed : 255, (outputGreen <= 255) ? outputGreen : 255, (outputBlue <= 255) ? outputBlue : 255);

return outputColor;

}

Testando l’algoritmo otteniamo il risultato desiderato anche se in un tempo di esecuzione piuttosto lungo e pari a 10,799 secondi.

Effetto Sepia in C#

Come per l’altro articolo, vediamo di ottenere un tempo più decente utilizzando le ColorMatrix:


private Image FastTransformToSepia(Image inputImage)

{

Bitmap outputBitmap = new Bitmap(inputImage.Width, inputImage.Height);

ImageAttributes attributes = new ImageAttributes();

ColorMatrix colorMatrix = new ColorMatrix(new float[][] {

new float[] {0.393f, 0.349f, 0.272f, 0, 0},

new float[] {0.769f, 0.686f, 0.534f, 0, 0},

new float[] {0.189f, 0.168f, 0.131f, 0, 0},

new float[] {0, 0, 0, 1, 0},

new float[] {0, 0, 0, 0, 1}

}

);

attributes.SetColorMatrix(colorMatrix);

Graphics outputGraphics = Graphics.FromImage(outputBitmap);

Rectangle rectInput = new Rectangle(0, 0, inputImage.Width, inputImage.Height);

outputGraphics.DrawImage(inputImage, rectInput, 0, 0, inputImage.Width, inputImage.Height, GraphicsUnit.Pixel, attributes);

outputGraphics.Dispose();

return outputBitmap;

}

In questo caso otteniamo un tempo di esecuzione di ben 894 millisecondi, molto meglio. Buon lavoro! ok emoticon

This entry was posted in Grafica, Linguaggi .Net, Programmazione and tagged , , , , , . Bookmark the permalink.

Lascia un Commento

L'indirizzo email non verrà pubblicato. I campi obbligatori sono contrassegnati *

*

È possibile utilizzare questi tag ed attributi XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>