2016-07-23 4 views
1

Ich habe Probleme mit der Verarbeitung von RGB_565 Bitmaps. Mein Code arbeitet für ARGB_8888 fein: Hier einige Code-Schnipsel, die ich für ARGB_8888 verwendet (was gut funktioniert):Prozess RGB_565 Bitmap in NDK

typedef struct 
{ 

    uint8_t red; 
    uint8_t green; 
    uint8_t blue; 
    uint8_t alpha; 
} argb; 
..... 
.....   
void* pixelscolor; 
    int ret; 
    int y; 
    int x; 
    uint32_t *pixel; 


    if ((ret = AndroidBitmap_getInfo(env, bmp, &infocolor)) < 0) { 
     //return null; 
    } 

    if ((ret = AndroidBitmap_lockPixels(env, bmp, &pixelscolor)) < 0) { 
    } 
    int width = infocolor.width; 
    int height = infocolor.height; 

    for (y = 0; y < height; y++) { 
     argb * line = (argb *) pixelscolor; 
     for (int n = 0; n < width; n++) { 
      int newValue = line[n].alpha+line[n].red+line[n].green+line[n].blue; 
...... 
.... 

ich ein Ergebnis wie dieses ARGB_8888 results.

Aber beim Versuch, das RGB_565 Format:

typedef struct 
{ 

    uint8_t red; 
    uint8_t green; 
    uint8_t blue; 

} rgb; 
..... 
.....   
void* pixelscolor; 
    int ret; 
    int y; 
    int x; 
    uint32_t *pixel; 


    if ((ret = AndroidBitmap_getInfo(env, bmp, &infocolor)) < 0) { 
     //return null; 
    } 

    if ((ret = AndroidBitmap_lockPixels(env, bmp, &pixelscolor)) < 0) { 
    } 
    int width = infocolor.width; 
    int height = infocolor.height; 

    for (y = 0; y < height; y++) { 
     rgb * line = (rgb *) pixelscolor; 
     for (int n = 0; n < width; n++) { 
      int newValue = line[n].red+line[n].green+line[n].blue; 
...... 
.... 

ich folgendes Ergebnis: RGB_565 result

Antwort

0

RGB_565 verwendet nur 2 Bytes pro Pixel, dh 16 Bit:

1   1 
5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 
| red | green | blue | 
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 

So zugreifen separate Farbkanäle können Sie folgenden Code verwenden:

uint16_t u16_pix; 

red = (u16_pix >> 11) & 0x1f; 
green = (u16_pix >> 5) & 0x3f; 
blue = (u16_pix >> 0) & 0x1f; 

sie ein:

u16_pix = (red << 11) | (green << 5) | (blue); 

Beachten Sie, dass Sie feststellen, dass Farbkanäle gewährleisten müssen Werte in ihre Grenzen passen muss, das heißt

red: 0 to 31 
green: 0 to 63 
blue: 0 to 31 
+0

Dank, dies löst das Problem der Doppelarbeit. aber die Qualität der Ergebnisse ist nicht so gut wie das ARGB_8888 Format. obwohl mein Programm niemals den Alpha-Kanal benutzt. trotzdem vielen herzlichen Dank :) – Thilleli

+0

@Thilleli Gern geschehen :) – Sergio