| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 900 人关注过本帖
标题:又问一个问题!
取消只看楼主 加入收藏
努力学编程
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2007-8-25
收藏
 问题点数:0 回复次数:7 
又问一个问题!
  怎么用C写一个程序,让它能够读一个位图(比如1.bmp),再写到另一个文件。也就是相当于复制。
搜索更多相关主题的帖子: 能够 
2007-08-26 17:14
努力学编程
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2007-8-25
收藏
得分:0 
以下是引用coachard在2007-8-26 17:31:16的发言:

#include <stdio.h>
#include <conio.h>
int main(void)
{
char ch;
FILE *fpOut,*fpIn;
fpOut=fopen("1.gif","rb+");
fpIn=fopen("2.gif","wb+");
if(fpOut==NULL || fpIn==NULL)
{
printf("Cannot open the img!\n");
exit(1);
}
ch=fgetc(fpOut);
while(!feof(fpOut))
{
fputc(ch,fpIn);
ch=fgetc(fpOut);
}
fclose(fpOut);
fclose(fpIn);
printf("Complete!Press any key to exit...\n");
getch();
return 0;
}


我说的是bmp,是要考虑BMP格式的,比如他的文件头,信息头……

2007-08-26 18:28
努力学编程
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2007-8-25
收藏
得分:0 

#include "stdio.h"
#include "conio.h"
#include "stdlib.h"
void main()
{
/* BMP文件头 */
typedef struct
{
unsigned short bfType; /* 文件类型 */
unsigned long bfSize; /* 文件大小 */
unsigned short bfReserved1; /* 保留位 */
unsigned short bfReserved2; /* 保留位 */
unsigned long bfOffBits; /* 数据偏移位置 */
} HEAD;

/* BMP信息头 */
typedef struct
{
unsigned long biSize; /* 此结构大小 */
long biWidth; /* 图像宽度 */
long biHeight; /* 图像高度 */
unsigned short biPlanes; /* 调色板数量 */
unsigned short biBitCount; /* 每个象素对应的位数,24:24位图,32:带alpha通道的24位图 */
unsigned long biCompression; /* 压缩 */
unsigned long biSizeImage; /* 图像大小 */
long biXPelsPerMeter;/* 横向分辨率 */
long biYPelsPerMeter;/* 纵向分辨率 */
unsigned long biClrUsed; /* 颜色使用数 */
unsigned long biClrImportant; /* 重要颜色数 */
}BMPINFOHEADER;

FILE *file ;
HEAD bmpFile;
BMPINFOHEADER bmpInfo;
char *pbuffer;

/* 打开文件 */
file = fopen("LENNA.BMP", "rb");
if (file== NULL)
{
printf(" openning error\n");
}
/* 读入文件头 */
fread(&bmpFile, sizeof(HEAD),1, file);
if (bmpFile.bfType != 0x4D42)
{
printf(" reading error!!!");
}
printf("%x\n",bmpFile.bfType); /* 验证文件类型 */
printf("%ld\n",bmpFile.bfSize);
printf("%ld\n",bmpFile.bfOffBits);

/* 读信息头 */
fread(&bmpInfo, sizeof(BMPINFOHEADER), 1, file);
printf("%ld\n",bmpInfo.biSizeImage);
printf("%d\n",bmpInfo.biWidth);
getch();

}
这个程序我用的是512*512的bmp图象。但是读/* 读信息头 */下面读到的数据都是错误的,比如bmpInfo.biWidth应该是512才对啊。

2007-08-26 18:40
努力学编程
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2007-8-25
收藏
得分:0 

内存对齐你能解释一下吗?还有 printf("%ld\n",bmpInfo.biSizeImage);我怎么读到的怎么是0。奇怪啊。
我看有的人这样写fread(&bmpFile, sizeof(HEAD)-2,1, file);

2007-08-26 19:21
努力学编程
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2007-8-25
收藏
得分:0 
栖柏,你大好人啊。呵呵。
飞燕来解释一下吧
2007-08-26 21:49
努力学编程
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2007-8-25
收藏
得分:0 
以下是引用coachard在2007-8-26 17:31:16的发言:

#include <stdio.h>
#include <conio.h>
int main(void)
{
char ch;
FILE *fpOut,*fpIn;
fpOut=fopen("1.gif","rb+");
fpIn=fopen("2.gif","wb+");
if(fpOut==NULL || fpIn==NULL)
{
printf("Cannot open the img!\n");
exit(1);
}
ch=fgetc(fpOut);
while(!feof(fpOut))
{
fputc(ch,fpIn);
ch=fgetc(fpOut);
}
fclose(fpOut);
fclose(fpIn);
printf("Complete!Press any key to exit...\n");
getch();
return 0;
}


我把这个程序改成这样:
#include <stdio.h>
#include <conio.h>
int main(void)
{
char ch;
FILE *fpOut,*fpIn;
fpOut=fopen("LENNA.BMP","rb+");
fpIn=fopen("1COPYlenna.bmp","wb+");
if(fpOut==NULL || fpIn==NULL)
{
printf("Cannot open the img!\n");
exit(1);
}
while((ch=fgetc(fpOut))!=EOF)
{
fputc(ch,fpIn);

}
fclose(fpOut);
fclose(fpIn);
printf("Complete!Press any key to exit...\n");
getch();
return 0;
}
为什么这样就不可以啊??

2007-08-26 22:21
努力学编程
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2007-8-25
收藏
得分:0 

我只是把while(!feof(fpOut))改成了while((ch=fgetc(fpOut))!=EOF),怎么 就不可以呢??

2007-08-27 09:45
努力学编程
Rank: 1
等 级:新手上路
帖 子:35
专家分:0
注 册:2007-8-25
收藏
得分:0 
果然是,谢谢了哦。
对了,内存对齐是怎么回事,能解释一下吗??
2007-08-27 11:33
快速回复:又问一个问题!
数据加载中...
 
   



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

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