zadanie niby proste - zmieszać kolory dwóch obrazków stosując dany współczynnik alpha
jednak wszystkie rozwiązania jakie znalazłem w Internecie polegają na przeleceniu po pikselach w unsafe kodzie - takie rozwiązanie mi się wydaje wbrew założeniom kodu zarządzanego
poza tym kod strasznie traci na czytelności i rozwiązania które znalazłem są strasznie długie w stosunku do zadania
tak więc napisałem na próbę własny kod:
private void Form1_Load(object sender, EventArgs e)
{
using (Bitmap bmp1 = new Bitmap("e:\\a.jpg"))
{
img1 = bmp1.Clone(new Rectangle(0, 0, bmp1.Width, bmp1.Height), System.Drawing.Imaging.PixelFormat.Format32bppArgb);
}
using (Bitmap bmp2 = new Bitmap("e:\\b.jpg"))
{
img2 = bmp2.Clone(new Rectangle(0, 0, bmp2.Width, bmp2.Height), System.Drawing.Imaging.PixelFormat.Format32bppArgb);
}
ia = new System.Drawing.Imaging.ImageAttributes();
cm = new System.Drawing.Imaging.ColorMatrix();
}
private void trackBar1_Scroll(object sender, EventArgs e)
{
cm.Matrix33 = (float)trackBar1.Value / 100f; // pomnożenie kanału alpha
ia.SetColorMatrix(cm);
img3 = (Image)img1.Clone();
Graphics.FromImage(img3).DrawImage(img2, new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height), 0f, 0f, img2.Width, img2.Height, GraphicsUnit.Pixel, ia);
pictureBox1.Image = img3;
}
w sumie wykorzystanie macierzy do zmiany kanału alpha może i jest głupie ale jak tak pomyślałem to daje wielkie możliwości rozbudowania efektu mieszania
wszystko działa pięknie i szybko ale mimo wszystko wydaje mi się że jednak za wolno ... :/
czy da się jakoś przyspieszyć ten kod lub ma ktoś pomysł jak to ładnie zakodować bez tworzenia brzydkich pętli ?