| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 598 人关注过本帖
标题:有关c语言图像处理的指针问题
只看楼主 加入收藏
jinmengjue
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-7-9
结帖率:0
收藏
已结贴  问题点数:20 回复次数:4 
有关c语言图像处理的指针问题
编译通过的,每次分步运行到if(*(pBmpBuf+i*lineByte+j)==255)的时候好像就有问题了,这个指针目的是表示如果第i行第j列的像素点的灰度值为255,即白色,就把他的横坐标j存入数组b,并记数,大家帮忙看看是不是逻辑上有什么问题啊?还是这个指针用的不对!!!
#include "stdio.h"
#include "Windows.h"
#include<iostream.h>
#include<math.h>
//几个全局变量,存放读入图像的位图数据、宽、高、颜色表及每像素所占位数(比特)
//此处定义全局变量主要为了后面的图像数据访问及图像存储作准备
unsigned char *pBmpBuf;//读入图像数据的指针
unsigned char *pBmpBuf_t;
int bmpWidth;//图像的宽
int bmpHeight;//图像的高
RGBQUAD *pColorTable;//颜色表指针
int biBitCount;//图像类型
int bfSize;
int bfOffBits;
int lineByte;
#define ROW 2448
#define COL 3264
/***********************************************************************
* 函数名称:
* readBmp()
*
*函数参数:
*  char *bmpName -文件名字及路径
*
*返回值:
*   0为失败,1为成功
*
*说明:给定一个图像文件名及其路径,读图像的位图数据、宽、高、颜色表及每像素
*      位数等数据进内存,存放在相应的全局变量中
***********************************************************************/
bool readBmp(char *bmpName)
{
    //二进制读方式打开指定的图像文件
    FILE *fp=fopen(bmpName,"rb");
    if(fp==0) return 0;
   
   
    //跳过位图文件头结构BITMAPFILEHEADER
    BITMAPFILEHEADER fileheader;
    fread(&fileheader, sizeof(BITMAPFILEHEADER), 1,fp);
    bfSize = fileheader.bfSize;
    bfOffBits = fileheader.bfOffBits;
    printf("bfSize=%d,bfOffBits=%d\n",bfSize,bfOffBits);

    fseek(fp, sizeof(BITMAPFILEHEADER),0);
   
    //定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
    BITMAPINFOHEADER head;  
    fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);
   
    //获取图像宽、高、每像素所占位数等信息
    bmpWidth = head.biWidth;
    bmpHeight = head.biHeight;
    biBitCount = head.biBitCount;
   
    //定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
    lineByte=(bmpWidth * biBitCount/8+3)/4*4;
    printf("lineByte=%d,bmpHeight=%d\n",lineByte,bmpHeight);

    //灰度图像有颜色表,且颜色表表项为2
    if(biBitCount==8){
    //    //申请颜色表所需要的空间,读颜色表进内存
        pColorTable=new RGBQUAD[256];
        fread(pColorTable,sizeof(RGBQUAD),256,fp);
    }

    pBmpBuf_t=new unsigned char[lineByte * bmpHeight];
    fread(pBmpBuf_t,1,lineByte * bmpHeight,fp);
   
    //申请位图数据所需要的空间,读位图数据进内存
    //fseek(fp, sizeof(BITMAPINFOHEADER)+2^biBitCount*sizeof(RGBQUAD),0);
    fseek(fp, bfOffBits,0);
    pBmpBuf=new unsigned char[lineByte * bmpHeight];
    fread(pBmpBuf,1,lineByte * bmpHeight,fp);
   
    //关闭文件
    fclose(fp);
   
    return 1;
}

/***********************************************************************
* 函数名称:
* saveBmp()
*
*函数参数:
*  char *bmpName -文件名字及路径
*  unsigned char *imgBuf  -待存盘的位图数据
*  int width   -像素为单位待存盘位图的宽
*  int  height  -像素为单位待存盘位图高
*  int biBitCount   -每像素所占位数
*  RGBQUAD *pColorTable  -颜色表指针

*返回值:
*   0为失败,1为成功
*
*说明:给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,
*      将其写到指定文件中
***********************************************************************/
bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,
             int biBitCount, RGBQUAD *pColorTable)
{
    //如果位图数据指针为0,则没有数据传入,函数返回
    if(!imgBuf)
        return 0;
   
    //颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
    int colorTablesize=0;
    if(biBitCount==8)
        colorTablesize=1024;

    //待存储图像数据每行字节数为4的倍数
    int lineByte=(width * biBitCount/8+3)/4*4;
   
    //以二进制写的方式打开文件
    FILE *fp=fopen(bmpName,"wb");
    if(fp==0) return 0;
   
    //申请位图文件头结构变量,填写文件头信息
    BITMAPFILEHEADER fileHead;
    fileHead.bfType = 0x4D42;//bmp类型
   
    //bfSize是图像文件4个组成部分之和
    fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
        + colorTablesize + lineByte*height;
    fileHead.bfReserved1 = 0;
    fileHead.bfReserved2 = 0;
   
    //bfOffBits是图像文件前三个部分所需空间之和
    fileHead.bfOffBits=54+colorTablesize;
   
    //写文件头进文件
    fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);
   
    //申请位图信息头结构变量,填写信息头信息
    BITMAPINFOHEADER head;
    head.biBitCount=biBitCount;
    head.biClrImportant=0;
    head.biClrUsed=0;
    head.biCompression=0;
    head.biHeight=height;
    head.biPlanes=1;
    head.biSize=40;
    head.biSizeImage=lineByte*height;
    head.biWidth=width;
    head.biXPelsPerMeter=0;
    head.biYPelsPerMeter=0;
    //写位图信息头进内存
    fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);
   
    //如果灰度图像,有颜色表,写入文件
    if(biBitCount==8)
        fwrite(pColorTable, sizeof(RGBQUAD),256, fp);
   
    //写位图数据进文件
    fwrite(imgBuf, height*lineByte, 1, fp);
   
    //关闭文件
    fclose(fp);
   
    return 1;
}

void main()
{
    //读入指定BMP文件进内存
    char readPath[]="3264乘2448细化.bmp";
    readBmp(readPath);
   
    //输出图像的信息
    printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBitCount);
    //循环变量,图像的坐标
    int i,j;
    i=bmpHeight;
    j=bmpWidth;
    int x1=0;
    int b[COL];
    pBmpBuf=new unsigned char[lineByte * bmpHeight];
    //每行字节数
    int lineByte=(bmpWidth*biBitCount/8+3)/4*4;
    //对于灰度图像
   if(biBitCount==8)  
    for(i=0;i<=bmpHeight;i++)
    {
        for(j=0;j<1550;j++)
        {
            if(*(pBmpBuf+i*lineByte+j)==255)  
            {
                   b[x1]=j;
                    x1=x1+1;
               
            }
        }
    }
        printf("x1=%d ",x1);
        for(i=0;i<x1;i++)
        { printf("%d ",b[i]);}

}

[ 本帖最后由 jinmengjue 于 2013-7-9 16:32 编辑 ]
搜索更多相关主题的帖子: include c语言 比特 
2013-07-09 16:25
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:10 
回复 楼主 jinmengjue
这个指针目的是表示如果第i行第j列的像素点的灰度值为255,即白色,就把他的横坐标j存入数组b,并记数。
请问横坐标是i还是j?

总有那身价贱的人给作业贴回复完整的代码
2013-07-09 19:32
a462410594
Rank: 2
等 级:论坛游民
帖 子:75
专家分:64
注 册:2011-11-17
收藏
得分:10 
⊙﹏⊙b汗,那么长!!!
2013-07-09 21:53
jinmengjue
Rank: 1
等 级:新手上路
帖 子:3
专家分:0
注 册:2013-7-9
收藏
得分:0 
回复 2楼 embed_xuel
是j,就是数组的列坐标,我看有的人程序上是这样写的*(pBmpBuf+i*(lineByte-1)+j)==255,这样写就可以顺利运行,就是计算的结果不对,我想问这样写和*(pBmpBuf+i*lineByte+j)==255有什么区别呢?
2013-07-10 09:01
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 4楼 jinmengjue
有什么区别难道看不出来吗?楼主对数组有多少了解?

总有那身价贱的人给作业贴回复完整的代码
2013-07-10 09:43
快速回复:有关c语言图像处理的指针问题
数据加载中...
 
   



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

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