2010-03-04 12 views
11

So che .NET Framework viene fornito con una classe di conversione di immagini (il metodo System.Drawing.Image.Save).Converti bmp da 24 bit a 16 bit?

Ma ho bisogno di convertire un'immagine bitmap a 24 bit (R8G8B8) in un 16 bit (X1R5G5B5) e non ho davvero idea di questo tipo di conversione e di una modifica da 24 a 16 bit nel l'intestazione di bmp non funzionerebbe (dato che abbiamo bisogno di convertire l'intera immagine).

Inoltre vorrei sapere se posso controllare il dithering immagine, ecc

idee? Qualsiasi tipo di aiuto sarebbe apprezzato.

risposta

18

Il formato di pixel Format16bppRgb1555 è dichiarato ma GDI + in realtà non lo supporta. Non esiste un driver video principale o un codec di immagine che abbia mai usato quel formato pixel. Qualcosa che i progettisti GDI + hanno indovinato potrebbe essere, la loro macchina del tempo non è stata sufficientemente accurata. Altrimenti una copia/incolla piuttosto sciatta dal programmatore che ha lavorato su System.Drawing.

RGB555 è la corrispondenza più vicina per l'hardware e codec disponibili:

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

È necessario salvare la bitmap con un parametro Encoder che specifica l'intensità del colore.

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

Ho provato questo e non funziona. Non importa se passo 24, 8 o 32. Il formato di output non cambia. Posso anche passare valori non validi come -8. La profondità del colore non cambia mai. – Elmue

+0

dipende dal tipo MIME. ha funzionato per tif, non ha notato cambiamenti su diversi formati –

1

Un modo davvero semplice per farlo è quello di ciclo sui vecchi dati bitmap e segreta ogni coppia di valori r8-g8-B8 a x1-R5-G5-B5, qualcosa di simile a questa funzione:

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); 
} 
Problemi correlati