2016-07-23 37 views
1

我正面临处理RGB_565位图的问题。我的代码工作正常ARGB_8888: 这里有一些代码段我用ARGB_8888(工作正常):在NDK中处理RGB_565位图

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; 
...... 
.... 

我得到这样 ARGB_8888 results结果。

但尝试RGB_565格式时:

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; 
...... 
.... 

我得到以下结果:RGB_565 result

回答

0

RGB_565每个像素使用仅2个字节,即16位:

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

所以访问单独的颜色通道,您可以使用下面的代码:

uint16_t u16_pix; 

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

对其进行设置:

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

注意,你必须确保颜色通道值必须融入自己的极限,即

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

谢谢,这样可以解决重复问题。但结果的质量不如ARGB_8888格式。尽管我的程序从不使用alpha通道。无论如何,非常感谢:) – Thilleli

+0

@Thilleli不客气:) – Sergio