嵌入式开发者社区

标题: C6748 图像处理算法调试 [打印本页]

作者: Cqidian    时间: 2015-7-23 20:36
标题: C6748 图像处理算法调试
bmp ReadBmp(char *bmpName)
{
        bmp m;                        // 定义一个位图结构
        FILE *fp;
        unsigned char *BmpBuf;
        int i;
        int bmpWidth;        // 图像的宽
        int bmpHeight;        // 图像的高
        int biBitCount;        // 图像类型,每像素位数
        int lineByte;

        if((fp=fopen( bmpName, "rb"))==NULL)
        {
                printf( "can't open the bmp imgae.\n ");
                exit(0);
        }
        else
        {
                fread(&m.file.bfType, sizeof(char), 2, fp);                                // 类型
                fread(&m.file.bfSize, sizeof(int), 1, fp);                                    // 文件长度
                fread(&m.file.bfReserverd1, sizeof(short int), 1, fp);        // 保留字 1
                fread(&m.file.bfReserverd2, sizeof(short int), 1, fp);        // 保留字 2
                fread(&m.file.bfbfOffBits, sizeof(int), 1, fp);                        // 偏移量
                fread(&m.info.biSize, sizeof(int), 1, fp);                                    // 此结构大小
                fread(&m.info.biWidth, sizeof(int), 1, fp);                                // 位图的宽度
                fread(&m.info.biHeight, sizeof(int), 1, fp);                            // 位图的高度
                fread(&m.info.biPlanes, sizeof(short), 1, fp);                            // 目标设备位图数
                fread(&m.info.biBitcount, sizeof(short) ,1, fp);                    // 颜色深度
                fread(&m.info.biCompression, sizeof(int), 1, fp);                    // 位图压缩类型
                fread(&m.info.biSizeImage, sizeof(int), 1, fp);                        // 位图大小
                fread(&m.info.biXPelsPermeter, sizeof(int), 1, fp);                // 位图水平分辨率
                fread(&m.info.biYPelsPermeter, sizeof(int), 1, fp);                // 位图垂直分辨率
                fread(&m.info.biClrUsed, sizeof(int), 1, fp);                            // 位图实际使用颜色数
                fread(&m.info.biClrImportant, sizeof(int), 1, fp);                    // 位图显示中比较重要颜色数
        }

        // 获取图像宽、高、每像素所占位数等信息
        bmpWidth = m.info.biWidth;
        bmpHeight = m.info.biHeight;
        biBitCount = m.info.biBitcount;

        // 定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
        lineByte = (bmpWidth*biBitCount/8+3)/4*4;

        // 灰度图像有颜色表,且颜色表表项为256
        if(biBitCount == 8)
        {
                // 分配内存空间
                m.pColorTable = (RGBQUAD *)malloc(256*4);
                // 申请颜色表所需要的空间,读颜色表进内存
                fread(m.pColorTable, sizeof(RGBQUAD), 256, fp);
        }

        // 分配内存空间
        m.imgBuf = (unsigned char *)malloc(m.info.biSizeImage);
        BmpBuf = (unsigned char *)malloc(m.info.biSizeImage);

        // 读位图数据
        fread(BmpBuf, lineByte * bmpHeight, 1, fp);

        // 将读到的数据垂直镜像翻转
        for(i = 0; i < bmpHeight; i++)
                memcpy((void *)(m.imgBuf + lineByte * i),
                                (void *)(BmpBuf + lineByte * (bmpHeight - i - 1)), lineByte);
        // 关闭文件
        fclose(fp);

        return m;
}
如果我想读取一个颜色深度为24的bmp图像(程序针对颜色深度为8),应该如何修改程序中的设置。。


作者: Lewis    时间: 2015-7-24 15:01
建议先研究一下BMP格式,在做相应修改
作者: Cqidian    时间: 2015-7-25 13:09
Lewis 发表于 2015-7-24 15:01
建议先研究一下BMP格式,在做相应修改

图像文件在一定的内存范围内,程序可以打开颜色深度24的bmp图像,但是图像要符合颜色深度8, 大小640*480像素才有较好的处理效果。bmp图像是从左向右,从下向上扫描,程序执行反色效果,这与图像大小的关系是什么,颜色深度也只是表示一个像素所占的字节大小




欢迎光临 嵌入式开发者社区 (https://www.51ele.net/) Powered by Discuz! X3.4