Dzień dobry. Napisałem w c# program który generuje z bitmapy kolorowe ASCII arty. Mam problem z wydajnością podczas kolorowania obrazka ( w rozdzielczości 1920x1080 generowanie trwa około 10 sekund ). Realizuję operację w ten sposób, że bitmapę z szarym ASCII artem mnożę (jak w PS) razy piksele obrazka kolorowego. Zaznaczyłem w kodzie ten fragment w którym odbywają się najdłuższe obliczenia, modyfikacja innych nie wpływa znacząco na wydajność.
public static Bitmap MultiplyImages(Bitmap OriginalImage, Bitmap AsciiImage, int width)
{
float scale = (OriginalImage.Width / width);
int newheight = (int)(OriginalImage.Height / scale) / 2;
int newwidth = (int)(OriginalImage.Width / scale);
Bitmap NewImage = new Bitmap(OriginalImage);
Bitmap resized = new Bitmap(OriginalImage, new Size(newwidth, newheight));
Bitmap OriginalImage2 = new Bitmap(resized, new Size(AsciiImage.Width, AsciiImage.Height));
Color temp = new Color();
Color temp2 = new Color();
Color NewColor = new Color();
int[] CurrentColor = new int[3];
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TUTAJ ZACZYNA SIĘ MNOŻENIE PIKSELI
for (int i = 0; i < OriginalImage2.Width; i++)
{
for (int j = 0; j < OriginalImage2.Height; j++)
{
temp = OriginalImage2.GetPixel(i, j);
temp2 = AsciiImage.GetPixel(i, j);
CurrentColor[0] = (int)(temp.R * temp2.GetBrightness());
CurrentColor[1] = (int)(temp.G * temp2.GetBrightness());
CurrentColor[2] = (int)(temp.B * temp2.GetBrightness());
NewColor = Color.FromArgb(CurrentColor[0], CurrentColor[1], CurrentColor[2]);
NewImage.SetPixel(i, j, NewColor);
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
return NewImage;
}
Jak widać pobieram kolory pikseli obydwu obrazów za pomocą Bitmap.Getpixel(), mnożę składowe kolorów razy jasność piksela bitmapy z ASCII Artem, później tworzę nową zmienną typu System.Drawing.Color i zapisuję piksel do mapy wynikowej za pomocą Bitmap.Setpixel(). Jest to najbardziej intuicyjny sposób z użyciem klasy Bitmap. Bardzo proszę o poradę jak można to zrobić bardziej optymalnie. Mam nadzieję że wyjaśniłem problem w sposób jasny i rozumiecie o co chodzi;) Dziękuję za każdą pomoc o pozdrawiam.