| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 636 人关注过本帖
标题:求助 关于DC 哪位帮我改下啊...........
只看楼主 加入收藏
叶柄
Rank: 1
等 级:新手上路
帖 子:60
专家分:0
注 册:2007-10-17
收藏
 问题点数:0 回复次数:1 
求助 关于DC 哪位帮我改下啊...........
目的:统计测试数据(图片上数字)和。
思路:先切割出0-9 10个数字
       把图片放到内存DC上
        在DC上取像素点 比较  
        相同最多的即为该位数
程序如下:(哪位帮我改下啊.................)
程序代码:
#ifndef BMP_CLASS
#define BMP_CLASS
#include <afxwin.h>
#include <stdio.h>
#include <string.h>
class BMP
{
    HDC NumDC[10];
    int num;
public:
    BMP()
    {
        char lpFileName[20]="num (x).BMP";

        num = 0;
        for(int i=0;i<10;i++)//读入10张数字图片
        {
            lpFileName[5]='0'+i;
            NumDC[i]=ReadBmp(lpFileName);
        }

    };
    int GetNum()const{return num;};

    void Calculate(LPCTSTR lpFileName);
private:
    //读取图片的函数,返回内存DC
    HDC ReadBmp(LPCTSTR lpFileName)const;
    //读取图片的函数,返回内存DC
};

//读取图片的函数,返回内存DC
HDC BMP::ReadBmp(LPCTSTR lpFileName)const
{
    POINT dwBitmapSize;//定义图片的高,宽
                
    //打开图片
    HANDLE hFile=::CreateFile(lpFileName,GENERIC_READ,
        FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_ARCHIVE,NULL);
    if(hFile==INVALID_HANDLE_VALUE)
    {
        printf("读取文件失败!\n");
        return 0;
    }
    
    //创建一个内存映射文件对象
    HANDLE hMap=::CreateFileMapping(hFile,NULL,PAGE_READONLY,NULL,NULL,NULL);
    //将文件内容与线性地址对应,返回地址
    LPVOID lpBase=::MapViewOfFile(hMap,FILE_MAP_READ,0,0,0);
    
    BITMAPFILEHEADER *pFileHeader;//图片的BITMAPFILEHEADER结构
    BITMAPINFO *pInfoHeader;      //图片的BITMAPINFO结构
    pFileHeader=(BITMAPFILEHEADER*)lpBase;
    
    //图片象素部分内容地址
    BYTE *pBits=(BYTE*)lpBase+pFileHeader->bfOffBits;
    
    //BITMAPINFO结构地址并获取图片大小
    pInfoHeader=(BITMAPINFO*)( (BYTE*)lpBase+sizeof(BITMAPFILEHEADER) );
    dwBitmapSize.x=pInfoHeader->bmiHeader.biWidth;
    dwBitmapSize.y=pInfoHeader->bmiHeader.biHeight;
    
    //创建内存DC和位图
    HDC hCompatibleDC=::CreateCompatibleDC(NULL);
    HBITMAP hBitmap=::CreateCompatibleBitmap(NULL,dwBitmapSize.x,dwBitmapSize.y);
    ::SelectObject(hCompatibleDC,hBitmap);
    
    //将图片信息放到内存DC中
    ::SetDIBitsToDevice(hCompatibleDC,0,0,dwBitmapSize.x,dwBitmapSize.y,
        0,0,0,dwBitmapSize.y,pBits,pInfoHeader,DIB_RGB_COLORS);
    
    //关闭句柄
    ::DeleteObject(hBitmap);
    ::UnmapViewOfFile(lpBase);
    ::CloseHandle(hMap);
    ::CloseHandle(hFile);
    
    //返回内存DC
    return hCompatibleDC;
}
//计算
void BMP::Calculate(LPCTSTR lpFileName)
{
    int now=0,max=0,nownum;
    COLORREF c1,c2;
    //ReadBmp(LPCTSTR lpFileName,HDC hdc)
    HDC hdc;
    hdc=BMP::ReadBmp(lpFileName);//读入待计算的图片
    
    for(int number=0;number<5;number++)//读取第number个数
    {
        now =0;
        nownum = 0;
        for(int i=0;i<10;i++)//用第i个数和它比较
        {
            
            for(int x=0+number*10;x<10+number*10;x++)//读取第x列的像素点
            {
                for(int y=0;y<11;y++)//读取第y行的像素点
                {
                    c1 = ::GetPixel(hdc,x,y);
                    c2 = ::GetPixel(NumDC[i],x-number*10,y);
                    if(c1==c2)now++;printf("%ld,%ld\n",c1,c2);
                    
                }    
            }
            if(now>max){max=now;nownum = i;}
            printf("nownum is %d\n",nownum);
        }
        switch(number)
        {
        case 0: num+=10000*nownum;break;
        case 1: num+=1000*nownum;break;
        case 2: num+=100*nownum;break;
        case 3: num+=10*nownum;break;
        case 4: num+=1*nownum;break;
        }
    }

}

#endif
int main()
{
    BMP NUM;
    char filename[20];
    int i=0,j=0,k=0;
    strcpy(filename,"0.bmp");
    for(i=0;i<10;i++)
    {
        filename[0]='0'+i;    
        NUM.Calculate(filename);
        printf("%d\n",NUM.GetNum());
        getchar();
    }

    strcpy(filename,"10.bmp");
    for(i=1;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            filename[0]='0'+i;
            filename[1]='0'+j;
            NUM.Calculate(filename);
        }
    }

    strcpy(filename,"100.bmp");
    for(i=1;i<10;i++)
    {
        for(j=0;j<10;j++)
        {
            for(k=0;k<10;k++)
            {
                filename[0]='0'+i;
                filename[1]='0'+j;
                filename[2]='0'+k;
                NUM.Calculate(filename);
            }
        }
    }
    printf("[    %d   ]\n",NUM.GetNum());

    getchar();
    return 0;


    
}


测试数据.rar (36.15 KB)
搜索更多相关主题的帖子: 内存 BMP num include 数字 
2008-04-26 18:23
cumtzdhlx
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2007-7-8
收藏
得分:0 
兄弟,基本明白了你什么意思,我觉的此方法也不太可行吧,先问你一下,你把一个数字占用的象素定义为10列11行的,先不说这个图片是不是真的如此的均匀,如果你的对照图片不是这个大小当然结果不可靠,另外就算你用DIB头文件中的biwidth和biheight获得了对照图片"1","2"...的大小,你又能保证你的原图片例如"11111"中的第一个数字"1"白色部分前几列的列数和你对照图片"1"中是正好相等的呢,如果你对完整图片也进行了11行*10列矩阵切割,即第一个"1"和对照图片"1"是同样大小的,但他们前面是白色部分的列的个数不等,这个数据也是不可相信的,所以我先不说程序中有没有不妥的地方,这个想法就太好.

另外我喜欢直接读DIB中的数据,而不是象你那样用GetPixel来获取这个地方的RGB值,你读BMP的时候没必要象你写的那么麻烦,我感觉用不到兼容DC,和兼容位图,只要用malloc分配内存区,保存住DIB图象的数据的开始指针就可以了,其余位图文件头,信息头,调色板,图象数据行的指针都可以用头文件中的偏移量,文件头字符数,信息头字符数等等来得到,用了图象数据行的指针就可以提取里面的数据了,完全没必要上述那么麻烦的

个人见解,见谅!!
2008-04-26 21:49
快速回复:求助 关于DC 哪位帮我改下啊...........
数据加载中...
 
   



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

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