Frage

Ich habe einen 24bpp Bitmap zu lesen und jedes Pixel von RGB24 zu ARGB16 konvertieren.

Ich habe den folgenden Code ein,

#define ARGB16(a, r, g, b) ( ((a) << 15) | (r)|((g)<<5)|((b)<<10))

Aber ich bin nicht die erforderliche Leistung zu bekommen.

Jede Hilfe wäre sehr geschätzt.

War es hilfreich?

Lösung

Break it up. Lassen Sie uns auch weiterhin die Verwendung von Makros:

#define TRUNCATE(x)  ((x) >> 3)

#define ARGB16(a,r,g,b) ((a << 15) | (TRUNCATE(r) << 10) | (TRUNCATE(g) << 5) | TRUNCATE(b)))

Dies setzt voraus, das Alpha ist nur ein einzelnes Bit.

Andere Tipps

Da die RGB-Werte sind wahrscheinlich je 8 Bit, Sie müssen noch um sie zu fünf Bits gestutzt, damit sie nicht „überlappen“ im ARGB16 Wert.

Der einfachste Weg, um sie zu kürzen, ist sie wahrscheinlich nach rechts um drei Plätze auf Bitshift.

Es scheint mir, wie Sie wahrscheinlich die Bits maskieren wollen Sie nicht von r, g und b müssen. Vielleicht so etwas wie folgt aus:

#define ARGB16(a, r, g, b) ( ((a) << 15) | (r>>3)|((g>>3)<<5)|((b>>3)<<10))

Edit: hoppla, ich denke, die Antwort von Michael Buddingh wahrscheinlich richtig - Sie wollen weg zu verschieben, diese bekommt man die höchstwertigen Bits

.

Ich würde entweder eine Bitmaske verwenden loszuwerden, die Bits bekommen Sie nicht brauchen. (Farbwert & 0x1F)

So oder verschieben, um den Farbwert auf der rechten Seite 3 Bits (scheint, wie die bessere Option).

Und ist ein << 15 wirklich das, was Sie brauchen? Sie würden auf die Tatsache angewiesen sein, dass das 0 Bit 0 oder 1 ist das Alpha-Bit zu setzen oder ausschalten. Also, wenn Ihr Alpha-Wert 0xFE dann das Alpha Bit würde 0, während, wenn es 0x01 wäre, würde es 1 sein.

Das könnte dir maßstäblich wollen, anstatt TRUNCAT.

Nehmen Sie die R-Komponente zum Beispiel 0xDE(222) in 24-Bit-RGB-Format wird 0x1A = (222.0/0xFF)*0x1F in 16-Bit-RGB.

Ich habe den Code unten:

    FILE *inFile;
BmpHeader header;
BmpImageInfo info;
Rgb *palette;
int i = 0;

    inFile = fopen( "red.bmp", "rb" );

fread(&header, 1, sizeof(BmpHeader), inFile);
fread(&info, 1, sizeof(BmpImageInfo), inFile);

palette = (Rgb*)malloc(sizeof(Rgb) * info.numColors);

fread(palette, sizeof(Rgb), info.numColors, inFile);

unsigned char buffer[info.width*info.height];

FILE *outFile = fopen( "red.a", "wb" );
Rgb *pixel = (Rgb*) malloc( sizeof(Rgb) );

int read, j;

for( j=info.height; j>0; j-- ) 
{
    for( i=0; i<info.width; i++ ) 
    {
        fread(pixel, 1, sizeof(Rgb), inFile);
        buffer[i] = ARGB16(0, pixel->red, pixel->green, pixel->blue);
    }
}

    fwrite(buffer, 1, sizeof(buffer), outFile);

und ich bin ein rotes Bild zu lesen (255 0 0), und ich bin mit der von Ihnen definierte Funktion oben (#define ARGB16 (a, r, g, b) (((a) << 15) | ( R >> 3) | ((g >> 3) << 5) | ((b >> 3) << 10)) ), Aber die Ausgabedatei zeigt mir: 1F 1F 1F, wenn ich mit einem hexaeditor statt 7C00 ..

, um die Datei zu öffnen am
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top