| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1242 人关注过本帖
标题:bmp提取rgb,16位和1~8位显示不出来,有偿(+18574842994)
只看楼主 加入收藏
xiaofengzizz
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2019-5-8
结帖率:0
收藏
 问题点数:0 回复次数:0 
bmp提取rgb,16位和1~8位显示不出来,有偿(+18574842994)
  RGBQUAD *pRGB = (RGBQUAD *)malloc(sizeof(RGBQUAD)*(unsigned int)pow((float)2,info_h->biBitCount));  //调色板
    /*一个单元代表一种颜色
    调色板实际上是一个数组,它所包含的元素与位图所具有的颜色数相同,决定于biClrUsed和biBitCount字段。
    数组中每个元素的类型是一个RGBQUAD结构。真彩色无调色板部分。
    biBitCount;位数/像素,1、2、4、8、24.假如是16位,R占5位,G占5位,B占5位,空出一位,排列组合一共有2^15种颜色,其他位数同理。*/  
   
    //读取位图调色板数据  
    if(!MakePalette(pFile, file_h,info_h,pRGB))  
        printf("Nopalette!");  
   
    //16位:移位操作,从2字节中取出RGB信息,存到3字节中  
    if (info_h->biBitCount== 16)  
    {  
        for(Loop = 0; Loop < height * width; Loop += 2)  
        {  
            *rgbDataOut= (Data[Loop] & 0x1F) << 3;//B:用0001 1111取出低字节的右五位,再放到目标字节的高5位(通过右移3位),得到五位的B  
            *(rgbDataOut+ 1) = ((Data[Loop] & 0xE0) >> 2) + ((Data[Loop + 1] & 0x03)<< 6);//G:11100000取出低字节的左三位,00000011取出高字节的右两位,合并后,放到再放到目标字节的高5位,得到五位的G  
            *(rgbDataOut+ 2) = (Data[Loop + 1] & 0x7C) << 1; //R:0111 1100取出高字节的中间五位,再放到目标字节的高5位,得到5位的R  
   
            rgbDataOut+= 3;  
        }//RGB都各自位于字节的高5位  
    }  
   
    //1~8位:移位操作,从有限固定位中取出RGB信息,存到3字节中  
    //循环次数:有效数据字节数  
    for (Loop =0; Loop<width*height; Loop++)  
    {  
        //根据位深设置掩膜  
        switch(info_h->biBitCount)  
        {  
        case 1://1000 0000,1位,黑白双色图  
            mask = 0x80;  
            break;  
        case 2://1100 0000,2位,4色图  
            mask = 0xC0;  
            break;  
        case 4://1111 0000,4位,16色图  
            mask = 0xF0;  
            break;  
        case 8://1111 1111,8位,256色图  
            mask = 0xFF;  
        }  
   
        shiftCnt = 1;//控制mask的移位,决定取字节中哪些数据  
   
        while(mask)//循环一次就是一个字节的解析过程  
        {  
            index = mask == 0xFF ? Data[Loop] : ((Data[Loop] & mask) >> (8 -shiftCnt * info_h->biBitCount));  
            //Loop代表第几个带转换的原始有效数据  
            //pRGB代表调色板  
            //8位:mask=1111 1111,index=data[Loop],即index为bmp中原始有效数据,直接对应调色板数组下标,得到相应颜色  
   
            //查找调色板,取出对应BGR存入目标buffer:rgbDataOut  
            *rgbDataOut= pRGB[index].rgbBlue;//B  
            *(rgbDataOut+ 1) = pRGB[index].rgbGreen;//G  
            *(rgbDataOut+ 2) = pRGB[index].rgbRed;//R  
   
            if(info_h->biBitCount== 8)  
                mask = 0;//如果是8位bmp,一次性取完一个字节的颜色数据,直接跳出循环即可  
            else  
                mask >>= info_h->biBitCount;//若是1位bmp,则一字节取8次数据;若是2位bmp,则一字节取4次数据;若是4位bmp,则一字节取2次数据  
            //debugby LiuDong  
            if(Loop == width*height - 1)  
            {  
                rgbDataOut= rgbDataOut + 3 - width*height*3;  
                break;  
            }  
            rgbDataOut+= 3;  
            shiftCnt++;  
        }  
    }  

[此贴子已经被作者于2019-5-9 11:10编辑过]

搜索更多相关主题的帖子: bmp 调色 字节 取出 Data 
2019-05-09 09:18
快速回复:bmp提取rgb,16位和1~8位显示不出来,有偿(+18574842994)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019739 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved