首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

BMP象素读取后用0和#显示不正常解决方法

2012-02-16 
BMP象素读取后用0和#显示不正常BMP图,24位色,宽x高:60x30代码如下:C/C++ codeIdHttp-Get(url,html)TJPEG

BMP象素读取后用0和#显示不正常
BMP图,24位色,宽x高:60x30
代码如下:

C/C++ code
IdHttp->Get(url,html);TJPEGImage *jpg=new TJPEGImage;html->Position=0;jpg->LoadFromStream(html);Graphics::TBitmap *bmp=new Graphics::TBitmap();bmp->Assign(jpg);int height=bmp->Height;int width=bmp->Width;int bit[30][60];TColor c;int row,col,k;for (row=0;row<height;row++)    for (col=0;col<width;col++)    {        c=bmp->Canvas->Pixels[row][col];        k=GetBValue(c);        if (k==255)            bit[height-row-1][col]=1;        else            bit[height-row-1][col]=0;    }AnsiString bit01;for(row=0;row<height;row++){    bit01="";    for(col=0;col<width;col++)        if (bit[row][col]==1)            bit01=bit01+"#";        else            bit01=bit01+"0";    Memo1->Lines->Add(bit01);}


比如图片数字是:5584,读取显示如下:
0000000#00000#####000000000000##############################
0000000#0000##00####0000000000##############################
0000000##00##00000###000000000##############################
0000000##00##000000##000000000##############################
0000000##00##00#0000#000000000##############################
0000000###00#0000000#000000000##############################
0000000#######00000##000000000##############################
00000000000###000####000000000##############################
0000000000000#000###0000000000##############################
00000000000000000#000000000000##############################
0000000#00#0000000000000000000##############################
0000000##0000####0000000000000##############################
0000000##000#######00000000000##############################
0000#00##00###0000##0000000000##############################
000#000##00##000000##000000000##############################
000#000##000#000000##000000000##############################
0000000##000#0000000#000000000##############################
0000000######000000##000000000##############################
000000000#####00000##000000000##############################
0000000000000#000###0000000000##############################
00000#00000000000##00000000000##############################
000#00000000000000000000000000##############################
000000000000000000000000000000##############################
000000000000000000000000000000##############################
0000000000000000000##000000000##############################
000000000000000000000000000000##############################
000000000000000000000000000000##############################
000000000000000000000000000000##############################
000000000000000000000000000000##############################
000000000000000000000000000000##############################

怎么这样??

[解决办法]
可能是宽/高混了,我的测试,你参考一下:
C/C++ code
void __fastcall TForm1::Button1Click(TObject *Sender){Graphics::TBitmap *bmp=new Graphics::TBitmap();bmp->Width=60;bmp->Height=30;TRect rec(0,0,60,30);bmp->Canvas->Font->Height=30;bmp->Canvas->TextRect(rec,0,0,"5584");Image1->Picture->Bitmap->Assign(bmp);  //输出图像看一下int height=bmp->Height;int width=bmp->Width;int bit[60][30];TColor c;int row,col,k;for (row=0;row<width;row++)    for (col=0;col<height;col++)    {        c=bmp->Canvas->Pixels[row][col];        k=GetBValue(c);        if (k==255)            bit[row][col]=1;        else            bit[row][col]=0;    }AnsiString bit01;for(col=0;col<height;col++){    bit01="";    for(row=0;row<width;row++)        if (bit[row][col]==1)            bit01=bit01+"#";        else            bit01=bit01+"0";    Memo1->Lines->Add(bit01);}} 


[解决办法]
除了2楼说的原因外,还有一个关键问题,就是楼主使用的是JPEG格式图像文件,而并非标题所说的BMP格式,JPEG文件因为压缩和解压的关系,造成了颜色的“不纯”,因此光靠if (k==255)来判断白色是不准确的,应该给一个误差范围,如if (k >= 255 - 32),32就是误差范围

热点排行