| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2005 人关注过本帖
标题:有关文件的读写,我的程序不知怎么保存不了图片,运行后没有图片出现,求大 ...
只看楼主 加入收藏
米卡
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2016-2-24
结帖率:100%
收藏
 问题点数:0 回复次数:9 
有关文件的读写,我的程序不知怎么保存不了图片,运行后没有图片出现,求大神指导

//全局变量定义
unsigned char *pBmpBuf;//读入图像数据的指针
int bmpWidth;//图像的宽
int bmpHeight;//图像的高
     RGBQUAD *pColorTable;//颜色表指针
int biBitCount;//图像类型,每像素位数
FILE *fp;

 
//读入文件              
void readBmp(char bmpName)
{//二进制读方式打开指定的图像文件
fp=fopen(bmpName,"rb");
if(fp==0) return 0;

//跳过位图文件头结构BITMAPFILEHEADER
fseek(fp, sizeof(BITMAPFILEHEADER),0);

//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
BITMAPINFOHEADER head;  
fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);
 //获取图像宽、高、每像素所占位数等信息
bmpWidth = head.biWidth;
bmpHeight = head.biHeight;
biBitCount = head.biBitCount;

 //定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
 //灰度图像有颜色表,且颜色表表项为256
if(biBitCount==8)
{//申请颜色表所需要的空间,读颜色表进内存

fread(pColorTable,sizeof(RGBQUAD),256,fp);
}
//申请位图数据所需要的空间,读位图数据进内存

fread(pBmpBuf,1,lineByte * bmpHeight,fp);

//关闭文件
fclose(fp);
return 1;
}

//主函数

void main()
{//读入指定BMP文件进内存
char readPath[]="E:\ma.bmp";
readBmp(readPath);

 //输出图像的信息
printf("width=%d,height=%d, biBitCount=%d\n",bmpWidth,bmpHeight, biBitCount);
 
 //将图像数据存盘
char writePath[]="E:\macpy.bmp";
saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);

//清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间
 free(pBmpBuf);
 if(biBitCount==8)
 free(pColorTable);
}



// 写入文件
void 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;
 //以二进制写的方式打开文件
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是图像文件前3个部分所需空间之和
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;
}
搜索更多相关主题的帖子: return 二进制 图片 信息 
2016-03-01 11:52
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
你对C语言一窍不通,代码是完全拷贝别人的吧
2016-03-01 12:04
米卡
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2016-2-24
收藏
得分:0 
回复 2楼 rjsp
是的,在学习阶段,求指导
2016-03-01 12:38
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
回复 3楼 米卡
得先将C学懂呀

程序代码:
#include <windows.h>
#include <stdio.h>

void* readbmp( const char* bmpname, BITMAPINFOHEADER* phead, RGBQUAD rgbtable[256], DWORD* prgbtablesize )
{
    FILE* fp = fopen( bmpname, "rb" );
    if( !fp )
        return NULL;

    // 文件头
    BITMAPFILEHEADER fileheader;
    fread( &fileheader, sizeof(fileheader), 1, fp );
    if( fileheader.bfType != 0x4D42 )
        return NULL;
    // 信息头
    fread( phead, sizeof(*phead), 1, fp );
    // 颜色映射表
    *prgbtablesize = 0;
    if( fileheader.bfOffBits > sizeof(BITMAPFILEHEADER) + phead->biSize )
    {
        *prgbtablesize = (fileheader.bfOffBits-sizeof(BITMAPFILEHEADER)-phead->biSize)/sizeof(RGBQUAD);
        fread( rgbtable, sizeof(*rgbtable), *prgbtablesize, fp );
    }
    // 颜色矩阵
    const LONG linebyte = (phead->biWidth*phead->biBitCount+31)/32*4;
    void* pBmpBuf = malloc( phead->biHeight * linebyte );
    fread( pBmpBuf, linebyte, phead->biHeight, fp );

    fclose( fp );
    return pBmpBuf;
}

int savebmp( const char* bmpname, const BITMAPINFOHEADER* phead, const RGBQUAD rgbtable[256], DWORD rgbtablesize, const void* pBmpBuf )
{
    FILE* fp = fopen( bmpname, "wb" );
    if( !fp )
        return 1;

    const LONG linebyte = (phead->biWidth*phead->biBitCount+31)/32*4;

    // 文件头
    BITMAPFILEHEADER fileheader = { 0x4D42 };
    fileheader.bfOffBits = sizeof(fileheader) + sizeof(*phead) + rgbtablesize*sizeof(*rgbtable);
    fileheader.bfSize = fileheader.bfOffBits + phead->biHeight*linebyte;
    fwrite( &fileheader, sizeof(fileheader), 1, fp );
    // 信息头
    fwrite( phead, sizeof(*phead), 1, fp );
    // 颜色映射表
    if( rgbtablesize != 0 )
        fwrite( rgbtable, sizeof(*rgbtable), rgbtablesize, fp );
    // 颜色矩阵
    fwrite( pBmpBuf, phead->biHeight*linebyte, 1, fp );

    fclose( fp );
    return 0;
}

int main( void )
{
    BITMAPINFOHEADER head;
    RGBQUAD rgbtable[256];
    DWORD rgbtablesize;
    void* pBmpBuf = readbmp( "E:\\ma.bmp", &head, rgbtable, &rgbtablesize );
    if( !pBmpBuf )
        return 1;

    printf( "width=%d, height=%d, biBitCount=%d\n", head.biWidth, head.biHeight, head.biBitCount );

    savebmp( "E:\\macpy.bmp", &head, rgbtable, rgbtablesize, pBmpBuf );

    free( pBmpBuf );
    return 0;
}

2016-03-01 13:03
米卡
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2016-2-24
收藏
得分:0 
回复 4楼 rjsp
谢谢你,我会好好学的!
2016-03-01 13:18
米卡
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2016-2-24
收藏
得分:0 
回复 4楼 rjsp
大神,打扰一下,运行exe后显示拒绝访问,是什么意思?
2016-03-01 13:32
米卡
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2016-2-24
收藏
得分:0 
回复 4楼 rjsp
好了,可以了,谢谢你。
2016-03-01 13:35
米卡
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2016-2-24
收藏
得分:0 
回复 4楼 rjsp
如果需要对图片进行滤波处理,该怎么办?求指导
2016-03-07 13:53
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:0 
以下是引用米卡在2016-3-7 13:53:19的发言:

如果需要对图片进行滤波处理,该怎么办?求指导
用OpenCV吧
虽然自己写也是很简单的,但你不会C语言,你绝大部分的时间将浪费在语法上。
2016-03-07 14:29
米卡
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2016-2-24
收藏
得分:0 
回复 9楼 rjsp

可以看一下这个么?


void MedianFilter(unsigned char *pImg1,unsigned char *pImg,int nWidth,int nHeight)  
{         
    unsigned char   *lpSrc;                         // 指向源图像的指针   
    unsigned char   *lpDst;                         // 指向要复制区域的指针  
    int         aValue[iFilterH*iFilterW];          // 指向滤波器数组的指针  
    int         i,j,k,l;                            // 循环变量   
    int         lLineBytes;                         // 图像每行的字节数   
    lLineBytes = WIDTHBYTES(nWidth * 8);  
    for ( i=0;i<nWidth;i++,pImg++ )  
        (*pImg)=0;  
    for(i = iFilterMY; i < nHeight - iFilterH + iFilterMY + 1; i++)  
    {  
        for(j = iFilterMX; j < nWidth - iFilterW + iFilterMX + 1; j++)  
        {  
            lpDst = pImg + lLineBytes * (nHeight - 1 - i) + j;  
            for (k = 0; k < iFilterH; k++)  
            {  
                for (l = 0; l < iFilterW; l++)  
                {   lpSrc = pImg1 + lLineBytes * (nHeight - 1 - i + iFilterMY - k) + j - iFilterMX + l;   
                    aValue[k * iFilterW + l] = *lpSrc;  
                }  
            }               
            *lpDst = GetMedianNum(aValue, iFilterH * iFilterW);  
        }  
    }      
unsigned char GetMedianNum();
char *bArray;
int iFilterLen;
{   int i,j,temp;  
    unsigned char bTemp;        
    for (j = 0; j < iFilterLen - 1; j ++)  
    {  
        for (i = j + 1 ; i < iFilterLen - j - 1; i ++)  
        {  
            if (bArray[i] > bArray[i + 1])  
            {   temp = bArray[i];  
                bArray[i] = bArray[i + 1];  
                bArray[i + 1] = temp;  
            }  
        }  
    }        
    if ((iFilterLen & 1) > 0)  
    {  bTemp = bArray[(iFilterLen + 1) / 2];  }  
    else  
    {bTemp = (bArray[iFilterLen / 2] + bArray[iFilterLen / 2 + 1]) / 2;  }   
    return bTemp;  
}   
}  
2016-03-07 14:38
快速回复:有关文件的读写,我的程序不知怎么保存不了图片,运行后没有图片出现, ...
数据加载中...
 
   



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

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