So Konvertieren Sie eine 12-bit-Bild in 8-bit in C/C++?

Alle Recht, so habe ich schon sehr frustriert, versuchen, zu konvertieren, ein 12-bit-Puffer, um ein 8-bit.
Die Bildquelle ist ein 12-bit-Graustufen (dekomprimiert von JPEG2000), dessen Farbe reicht von 0-4095. Jetzt habe ich, um diese zu reduzieren, um 0-255. Der gesunde Menschenverstand sagt mir, ich solle einfach teilen jeden pixel-Wert wie diese. Aber wenn ich dies versuchen, ist das Bild zu hell.

void 
TwelveToEightBit(
    unsigned char * charArray,
    unsigned char * shortArray,
    const int num )
{

    short shortValue  = 0; //Will contain the two bytes in the shortArray.
    double doubleValue  = 0; //Will contain intermediary calculations.

    for( int i = 0, j =0; i < num; i++, j +=2 )
    {
        //Bitwise manipulations to fit two chars onto one short.
        shortValue = (shortArray[j]<<8);
        shortValue += (shortArray[j+1]);

        charArray[i] = (( unsigned char)(shortValue/16));
    }
}

Jetzt kann ich sagen, dass es muss einige Kontrast-Einstellungen. Irgendwelche Ideen, jedermann?

Vielen Dank im Voraus

Warum ist shortArray deklariert als unsigned char * statt der bequemen unsigned* geben?
Könnten Sie etwas zu Experimentieren, mit gamma-Korrektur: so etwas wie pow(double(pixel)/16, gamma)/pow(255,gamma) - gamma-Korrektur von sagen, 1.1 und je nach Geschmack.
Denn was auch immer Leser, den ich verwenden liest ein byte zu einer Zeit, wie die meisten. Jedoch, es enthält doppelt so viel Platz wie die charBuffer, denn es muss zweimal die Menge von bytes.
Ja, ich denke, das ist etwas sehr ähnlich, was ich am Ende tun. Ich werde auf jeden Fall geben Sie einen Versuch zu sehen, wohin es mich auch führt.

InformationsquelleAutor Sir Wellington | 2010-10-13

Schreibe einen Kommentar