BMP象素读取后用0和#显示不正常

时间:2022-07-02 15:25:05
BMP图,24位色,宽x高:60x30
代码如下:

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##############################

怎么这样??

5 个解决方案

#1


为何只能获取前边两个数字数据,并且倒过来显示?

#2


可能是宽/高混了,我的测试,你参考一下:

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);
}

}

结果是OK的

#3


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

#4


感谢各位..特别感谢keiy,确实是宽高搞错了..

#5


maozefa,我不是判断白色,我取组成颜色的蓝色值我有用处的.

#1


为何只能获取前边两个数字数据,并且倒过来显示?

#2


可能是宽/高混了,我的测试,你参考一下:

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);
}

}

结果是OK的

#3


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

#4


感谢各位..特别感谢keiy,确实是宽高搞错了..

#5


maozefa,我不是判断白色,我取组成颜色的蓝色值我有用处的.