Molto 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.

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! ![]()
Mi chiamo Denis Billi, ho 25 anni e sono della provincia di Ravenna. Mi sono laureato nell'estate del 2008 presso la facoltà di Ingegneria Informatica dell'università di Bologna e attualmente sto seguendo i corsi per la Laurea Specialistica in Ingegneria Informatica sempre all'università di Bologna.