2010-03-04 65 views
11

Sé que .NET Framework viene con una clase de conversión de imagen (el método System.Drawing.Image.Save).¿Convertir bmp de 24 bits a 16 bits?

Pero necesito convertir una imagen de mapa de bits de 24 bits (R8G8B8) en una de 16 bits (X1R5G5B5) y realmente no tengo idea de este tipo de conversión, y un cambio de 24 a 16 bits en el El encabezado bmp no funcionaría (ya que necesitamos convertir toda la información de la imagen).

También me gustaría saber si puedo controlar el Dither imagen, etc.

ideas? Cualquier tipo de ayuda sería apreciada.

Respuesta

18

Se ha declarado el formato de píxeles Format16bppRgb1555, pero GDI + en realidad no lo admite. No hay un controlador de video de flujo principal o códec de imagen que alguna vez haya usado ese formato de píxel. Algo que los diseñadores de GDI + supusieron pudo haber ocurrido, su máquina del tiempo no era lo suficientemente precisa. De lo contrario, una copia/pegamento bastante descuidada del programador que trabajó en System.Drawing.

RGB555 es la coincidencia más cercana para el hardware y los codecs disponibles:

public static Bitmap ConvertTo16bpp(Image img) { 
    var bmp = new Bitmap(img.Width, img.Height, 
        System.Drawing.Imaging.PixelFormat.Format16bppRgb555); 
    using (var gr = Graphics.FromImage(bmp)) 
     gr.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height)); 
    return bmp; 
} 
1

Debe guardar el mapa de bits con un parámetro Encoder que especifica la profundidad del color.

myEncoder = Encoder.ColorDepth; 
    myEncoderParameters = new EncoderParameters(1); 

    // Save the image with a color depth of 24 bits per pixel. 
    myEncoderParameter = new EncoderParameter(myEncoder, 24L); 
    myEncoderParameters.Param[0] = myEncoderParameter; 

    myBitmap.Save("MyBitmap.bmp", myImageCodecInfo, myEncoderParameters); 
+3

Probé esto y no funciona. No importa si paso 24, 8 o 32. El formato de salida no cambia. Incluso puedo pasar valores no válidos como -8. La profundidad de color nunca cambia. – Elmue

+0

depende del tipo mimetype. funcionó para tif, no notó cambios en diferentes formatos –

1

Una forma muy sencilla de hacer esto es un bucle sobre los datos antiguos de mapa de bits y encubierta cada par de valores r8-g8-B8 a x1-R5-g5-b5, algo parecido a esta función:

char condense(char i) 
{ 
    return (char)(i*255.0f/31.0f); 
} 

short transform(long input)// note that the last 8 bytes are ignored 
{ 
    return condense(input&0xff) || (condense((input&0xff00)>>8)<<5) 
    || (condense((intput&0xff0000)>>16)<<10); 
} 

// and somewhere in your program 
{ 
    int len; // the length of your data in pixels 
    char *data; // your data 
    char *newdata; // this is where you store the new data; make sure it's allocated 

    for(char *p=data; p<data+len*3; p+=3) 
    *(short *)newdata=transform(*(long *)data); 
} 
Cuestiones relacionadas