Creo que el problema es este:(ushort)
esto depende de la forma de especificar el color en 24 o 32 bits... pero ¿No se intercambian el color rojo por el azul?
public Int32 ConvertirA16Bit(Int32 color) { return (Int32) ( ((color >> 8) & 0xF800) | ((color >> 5) & 0x07E0) | (color >> 3) ); }
Yo asumo que la entrada en un color de 32 bits es AARRGGBB y en uno de 24 es 00RRGGBB. Así, funciona para los dos casos. De todas formas, en algunos sitios ésto cambia. Por ejemplo, en los TGA se guarda el color en formato BGR en vez de RGB. Si la entrada es diferente, ya es cosa de JuanK adaptarla
Código: Text public UInt16 ConvierteA16Bit(Int32 color) { byte uno, dos, tres; /* Separar las componentes de byte * para poder posteriormente calcular la proporcion * independiente por cada componente de color.*/ uno = (byte)(color & 0x000000FF); dos = (byte)((color & 0x0000FF00)>>8); tres= (byte)((color & 0x00FF0000)>>16); return ( (ushort)( (((uno >> 3) & 0x1F) << 11) | (((dos >> 2) & 0x3F) << 5) | (((tres >> 3) & 0x1F) << 0) ) ); }