BMP 解码

2019-08-14 04:33发布

[mw_shl_code=c,true]                while(1)
                {                                 
                        while(count<readlen)  //&#182;áè&#161;ò&#187;′&#216;1024éè&#199;&#248; (SectorsPerClust &#195;&#191;′&#216;éè&#199;&#248;êy)
                    {
                                if(color_byte==3)   //24&#206;&#187;&#209;&#213;é&#171;í&#188;
                                {
                                        switch (rgb)
                                        {
                                                case 0:                                  
                                                        color=bmpbuf[count]>>3; //B
                                                        break ;          
                                                case 1:          
                                                        color+=((u16)bmpbuf[count]<<3)&0X07E0;//G
                                                        break;          
                                                case 2 :
                                                        color+=((u16)bmpbuf[count]<<8)&0XF800;//R          
                                                        break ;                       
                                        }   
                                }
                                rgb++;          
                                count++ ;                  
                                if(rgb==color_byte) //&#203;&#174;&#198;&#189;·&#189;&#207;ò&#182;áè&#161;μ&#189;1&#207;&#241;&#203;&#216;êyêy&#190;Yoó&#207;&#212;ê&#190;
                                {       
                                        if(x<picinfo.ImgWidth)                                                                            
                                        {       
                                                realx=(x*picinfo.Div_Fac)>>13;//x&#214;áêμ&#188;ê&#214;μ
                                                if(is_element_ok(realx,realy,1)&&yok)//·&#251;o&#207;ì&#245;&#188;t
                                                {                                                                                                           
                                                        pic_phy.draw_point(realx+picinfo.S_XOFF,realy+picinfo.S_YOFF-1,color);//&#207;&#212;ê&#190;í&#188;&#198;&#172;         
                                                }                                                                               
                                        }
                                        x++;//x&#214;á&#212;&#246;&#188;óò&#187;&#184;&#246;&#207;&#241;&#203;&#216;
                                        color=0x00;
                                        rgb=0;                    
                                }
                                countpix++;//&#207;&#241;&#203;&#216;à&#219;&#188;ó
                                if(countpix>=rowlen)//&#203;&#174;&#198;&#189;·&#189;&#207;ò&#207;&#241;&#203;&#216;&#214;μμ&#189;á&#203;.&#187;&#187;DD
                                {                 
                                        y--;
                                        if(y==0)break;                         
                                        realy=(y*picinfo.Div_Fac)>>13;//êμ&#188;êy&#214;μ&#184;&#196;±&#228;         
                                        if(is_element_ok(realx,realy,0))yok=1;//′&#203;′|2&#187;&#184;&#196;±&#228;picinfo.staticx,yμ&#196;&#214;μ         
                                        else yok=0;
                                        x=0;
                                        countpix=0;
                                        color=0x00;
                                        rgb=0;
                                }         
                        }                
                        res=f_read(f_bmp,databuf,readlen,(UINT *)&br);//&#182;á3&#246;readlen&#184;&#246;×&#214;&#189;ú
                        if(br!=readlen)readlen=br;        //×&#238;oóò&#187;&#197;úêy&#190;Y                  
                        if(res||br==0)break;                //&#182;áè&#161;3&#246;′í
                        bmpbuf=databuf;
                          count=0;
                }  [/mw_shl_code]

对于真彩图,一个像素要三个字节分量才能显示,也就是 RGB,那应该是取完三个字节分量后画一个点,这里前面的代码也是这个意思,不过这里的 countpix 既然是统计像素个数,那应该是画一个点后值加1啊,为什么是取一个分量字节后就加一?
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。