Aprovechando un ratillo libre en estos días de fiestas, estoy convirtiendo el fondo de pantalla de Android PoliBalls a salvapantallas de Windows. Aunque el código original está en opengl y debería funcionar también en Windows hay cierto «tuneo» especial para Android, por lo que para empezar he decidido no complicarme la vida y tirar de System.Graphics.
Para rotar los bitmaps en opengl utilizaba transformadas y para colorear glBlendFunc junto a glColor4ub en mi caso. En C# el rotado es similar y para colorear he utilizado una matriz de color, que permite de una forma fácil transformaciones complejas de color en todos los canales.
Aquí tenéis un ejemplo que colorea el bitmap de rojo y lo rota 45º.
private void PoliBalls_Paint(object sender, PaintEventArgs e) { ImageAttributes imageAttributes = new ImageAttributes(); float[][] colorMatrixElements = { new float[] {1, 0, 0, 0, 0}, // red scaling factor new float[] {0, 0, 0, 0, 0}, // green scaling factor new float[] {0, 0, 0, 0, 0}, // blue scaling factor new float[] {0, 0, 0, 1, 0}, // alpha scaling factor new float[] {0, 0, 0, 0, 1}}; // traslation factors ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements); imageAttributes.SetColorMatrix( colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); e.Graphics.RotateTransform(45); e.Graphics.DrawImage(myImage, new Rectangle(0, 0, 64, 64), 0,0,64,64, GraphicsUnit.Pixel, imageAttributes); }
Es de lo mejor