C语言处理BMP图像

C语言处理BMP图像数字图像处理第一次实验报告1项目概要1.1 项目基本要求编写C/C++程序对bmp图像进行处理1.2 项目成果正确实现上述要求,生成相应的文件和实现相应的图片效果。1.3开发工具和环境开发工具:vc6.0操作系统:Windows 7开发语言: C2实验需求2.1实验需求1、灰度BMP图像的读写:(1)读入lena.bmp文件;(2)通过文件内

1项目概要

1.1 项目基本要求C语言处理BMP图像

编写C/C++程序对bmp图像进行处理

1.2 项目成果

正确实现上述要求,生成相应的文件和实现相应的图片效果。

1.3开发工具和环境

开发工具:vc6.0

操作系统:Windows 7

开发语言: C

2实验需求

2.1实验需求

1、灰度BMP图像的读写:

1)读入lena.bmp文件;

2)通过文件内容得出文件大小,位图数据起始字节,图像长、宽以及每像素的位数等信息;

3)提取出原图像中的位图数据,另存为lena.raw, 并通过photoshop打开该文件,查看所读取的数据。

4)仅取原始图像左上角1/4的数据,另存一个lenas.bmp图像,在photoshop中打开查看效果。

2. 彩色BMP图像读写

1)读入文件lena_C.bmp文件;

2)通过文件内容得出文件大小,位图数据起始字节,图像长、宽以及每像素的位数等信息;

3)提取出原图像中的位图数据,另存为lena_C.raw, 并通过photoshop打开该文件,查看所读取的数据。

4)仅取原始图像左上角1/4的数据,另存一个lena_Cs.bmp图像,在photoshop中打开查看效果。

关键设计与实现

#include<stdafx.h>

#include<stdio.h>

#include<stdlib.h>

#include<windows.h>

unsigned char *pBmpBuf;

unsigned char *pBmpBuf1;

bool saveBmp(char *bmpName, unsigned char *imgBuf, 

             int width, int height, 

             int biBitCount, RGBQUAD *pColorTable)

{

int biHeight=512,biWidth=512;

FILE *fp1=fopen(“F://lena.bmp”,”rb+”);

    //如果位图数据指针为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”);

FILE *fp2=fopen(“F://lenas.bmp”,”wb+”);

    if(fp2==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, fp2);

    //申请位图信息头结构变量,填写信息7头信息

    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, fp2);

    //如果灰度图像,有颜色表,写入文件 

RGBQUAD *pColorTable1;

 if(biBitCount==8)

{

        pColorTable1=new RGBQUAD[256];

        fread(pColorTable1,sizeof(RGBQUAD),256,fp1);

    }

    if(biBitCount==8)

        fwrite(pColorTable1, sizeof(RGBQUAD),256, fp2);

    //写位图数据进文件

int y = (biWidth * biBitCount/8+3)/4*4;

fseek(fp1, -y*biHeight/2,2);

long q; 

if((q=ftell(fp1))==-1L)  

    {  

        puts(“GetBitmapHeader读取文件指针位置失败!”);  

        return 0;  

    }  

    else  

    printf(“起始字节:%d\n”,q);

pBmpBuf1=new unsigned char[lineByte*biHeight];

printf(“hello world1”);

int t;

for(t=0;t<biHeight/2;t++)

{

fread(pBmpBuf1,1,y/2,fp1);

fseek(fp1,y/2,1);

fwrite(pBmpBuf1,y/2,1,fp2);

}

printf(“hello world2”);

fclose(fp2);

fclose(fp1);

return 1;

}

void main()

{

FILE *in,*out;

int biWidth,biHeight,biBitCount,startadd;

short int bmph,bmpInfo,*bmpData;

int bfSize;

RGBQUAD *pColorTable;

unsigned char *pBmpBuf;

if((in=fopen(“F:\\lena.bmp”,”rb+”))==NULL)

{

printf(“Can not open this file.\n”);

exit(0);

}

fseek(in,2L,SEEK_SET);

fread(&bfSize,sizeof(int),1,in);

printf(“bfSize is %d\n”,bfSize);

fseek(in,18L,SEEK_SET);

fread(&biWidth,sizeof(int),1,in);

printf(“biWidth is %d\n”,biWidth);

fseek(in,22L,SEEK_SET);

fread(&biHeight,sizeof(int),1,in);

printf(“biHeight is %d\n”,biHeight);

fseek(in,28L,SEEK_SET);

fread(&biBitCount,sizeof(int),1,in);

printf(“biBitCount is %d\n”,biBitCount);

fseek(in,1078L,SEEK_SET);

startadd=ftell(in);

if(startadd==-1L)

printf(“error!\n”);

else 

printf(“startadd is %d\n”,startadd);

int lineByte=(biWidth*biBitCount/8+3)/4*4;

if((out=fopen(“f:\\lenas.raw”,”wb+”))==NULL)

{

printf(“Can not open file.\n”);

return;

}

char buf[512][512];

fseek(in,1078L,SEEK_SET);

for(int i=biHeight-1;i>=0;i–)

{

for(int j=0;j<=lineByte-1;j++)

{

fputc(fgetc(in),out);

}

}

fclose(in);

fclose(out);

 char writePath[]=”F://lenas.bmp.BMP”;

 saveBmp(writePath, pBmpBuf, biWidth/2,biHeight/2, biBitCount, pColorTable);

system(“pause”);

delete []in;

delete []out;

}

4成果截图

4.1灰度图像

C语言处理BMP图像C语言处理BMP图像

4.2彩色图像

C语言处理BMP图像

C语言处理BMP图像

今天的文章C语言处理BMP图像分享到此就结束了,感谢您的阅读,如果确实帮到您,您可以动动手指转发给其他人。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/30923.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注