用c语言读取bmp格式的图像文件,将色彩数据保持在一个c语言二维数组排序中

网站已改版,请使用新地址访问:
readbmp 使用标准的C语言写的BMP图像读取并存储程序。头文件包含 的结构体,给定一个图 Special Effects 图形 处理 267万源代码下载- www.pudn.com
&文件名称: readbmp& & [
& & & & &&]
&&所属分类:
&&开发工具: C-C++
&&文件大小: 30 KB
&&上传时间:
&&下载次数: 10
&&提 供 者:
&详细说明:使用标准的C语言写的BMP图像读取并存储程序。头文件包含BMP图像的结构体,给定一个图像文件名及其路径,读图像的位图数据、宽、高、颜色表及每像素位数等数据进内存,存放在相应的全局变量中,同时将其写到指定文件中。 -Using the standard C language to read and write BMP image storage program. The header file contains the structure of BMP images, given an image file name and path, read the bitmap image data, width, height, and bits per pixel color tables and other data into memory, stored in the corresponding global variable, At the same time it is written to the specified file.
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&Debug\readbmp.pch&&.....\vc60.idb&&.....\vc60.pdb&&bmp.h&&main.cpp&&readbmp.ncb&&readbmp.plg&&readBMP.c&&readbmp.dsp&&readbmp.dsw&&readbmp.opt&&Debug
&[]:很好,推荐下载
&近期下载过的用户:
&输入关键字,在本站267万海量源码库中尽情搜索:
&[] - linux下将各类格式图片转换最新工具,包含bmp,jpeg,gif,ppm,jpg,pcx,png,
&[] - 手把手教你了解BMP图形文件结构,C语言文件读写函数应用,一般数据处理方法,如果看不懂,说明我写的还不够具体,以后继续改进.
&[] - 图像处理中24位彩色图像转换成灰度图像的c语言程序,已经调通了,希望对大家有帮助啊
&[] - vc mfc中保存bmp位图完整的源代码的几种方法用c语言把bmp格式的彩色图片转换成黑白的_c语言吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:565,240贴子:
用c语言把bmp格式的彩色图片转换成黑白的收藏
我大概知道思路是怎么样的。但是完全不会写。。以下是效果图我在网上找了下 和我想要的似乎都不大一样。求大神们指点
时光IT学院,免费在线直播教学,大牛现场答疑;拒绝纯理论学习,以c/c++/java项目实战为核心.针对c/c++/java零基础学员,快速入门,高薪就业.
求Y值,然后二值化
RPG转灰度的算法,不知道LZ要干嘛,我在ege上实现过
#include&stdio.h&#include&stdlib.h&#include&string.h&#define RGB 3.0#define OFFWIDTH 18#define MAX 255.0struct BitMap {
} H/*void change(FILE *a, float b);void change(FILE *a, float b) {
if (b&1.0 || b&0.0) {
printf("Error threshold value is not valid\n");
memset(&Header, 0, sizeof(Header));
fread(&Header, OFFWIDTH, 1, a); // 18 was used as width has offset of 18 (which is in decimal)
fread(&Header.width, sizeof(Header.width), 1, a);
fread(&Header.height, sizeof(Header.height), 1, a);
fread(&Header.colourplanes, sizeof(Header.colourplanes), 1, a);
fread(&Header.bitsperpixel, sizeof(Header.bitsperpixel), 1, a);
if (Header.bitsperpixel!=24) {
printf("Image uses compression which is not handled by this program\n");
signed int image [Header.width][Header.height][3];
float avg = 0.0;
for (i=0; i&Header. i++) {
for (j=0; j&Header. j++) {
image[i][j][2] = getc(a);
image[i][j][1] = getc(a);
image[i][j][0] = getc(a);
avg = (image[i][j][0]+image[i][j][1]+image[i][j][2])/RGB;
ratio = avg/(RGB*MAX);
// this was found by testing files that contained only pure blue, red and green
printf("Pixel (%d, %d) : [%d, %d, %d]\n", i, j, image[i][j][0], image[i][j][1], image[i][j][2]);
printf("The average is: %f\n", avg);
printf("The threshold value is: %f\n", threshold);
if (ratio&b) printf("good\n");
this approach uses too much memory hence better be avoided
}}*/int main (int argc, char **argv) {
FILE *BMPF
if(argc & 2) {
printf("Usage : ./a.out &filename&");
else BMPFile = fopen(argv[1], "rb");
memset(&Header, 0, sizeof(Header));
fread(&Header, 18, 1, BMPFile); // 18 was used as width has offset of 18 (which is in decimal)
fread(&Header.width, sizeof(Header.width), 1, BMPFile);
fread(&Header.height, sizeof(Header.height), 1, BMPFile);
printf("%d\n", Header.width);
printf("%d\n", Header.height);
fread(&Header.colourplanes, sizeof(Header.colourplanes), 1, BMPFile);
printf("%d\n", Header.width);
printf("%d\n", Header.height);
fread(&Header.bitsperpixel, sizeof(Header.bitsperpixel), 1, BMPFile);
if (Header.bitsperpixel!=24) {
printf("Image uses compression which is not handled by this program\n");
printf("%d\n", Header.width);
signed int image[Header.width][Header.height][3];
float avg = 0.0;
for (i=0; i&Header. i++) {
for (j=0; j&Header. j++) {
image[i][j][2] = getc(BMPFile);
image[i][j][1] = getc(BMPFile);
image[i][j][0] = getc(BMPFile);
avg = (image[i][j][0]+image[i][j][1]+image[i][j][2])/(RGB*MAX);
// this was found by testing files that contained only pure blue, red and green
printf("Pixel (%d, %d) : [%d, %d, %d]\n", i, j, image[i][j][2], image[i][j][0], image[i][j][1]);
printf("The average is: %f\n", avg);
change(BMPFile, 10);
fclose(BMPFile);
return 0; }
用gdk-pixbuf两分钟编完了
system("convert infile -monochrome outfile")...
百度了下 这貌似和心理学有关
求不说bmp……最近被这玩意搞得晕头转向……
LZ用库的话应该很简单。只要申明“读入test.bmp” 然后申明输出“gray”就可以了 代码不会超过20行google : imagemagck 或 graphicsmagick 建议后面那个。
上海鸣志中国运动控制产品综合制造商,提供更专业、节能、高效的产品
读取文件,提取每像素rgb,对每个像素如果rgb平均大于某值(127),则改为255 255 255,否则改为000,写回文件。读取文件和提取像素的方式参照bmp文件协议,具体看wikipedia。也可以用库,如果你不愿意花一天时间写个解析bmp文件的程序
#include&stdio.h&#include&stdlib.h&#include&string.h&typedef unsigned char BYTE;#define RGB 3.0#define MAX 255.0struct BitMap{
short Reserve1;
short Reserve2;
long FileS
short ClrP
short BitsPerP
long XPixPerM
long YPixPerM
long ClrTBC
long ImpC} Htypedef struct{
R} __attribute__((__packed__))RGBTRIPLE; int main(int argc, char **argv) {
FILE *inptr, *
threshold = atoi(argv[2]);
if(argc & 3) {
printf("Usage : ./a.out &filename& threshold\n");
else inptr = fopen(argv[1], "rb");
outptr = fopen ("out.bmp", "wb");
memset(&Header, 0, sizeof(Header));
fread(&Header.Type, 2, 1, inptr);
fwrite(&Header.Type, 2, 1, outptr);
fread(&Header.Size, 4, 1, inptr);
fwrite(&Header.Size, 4, 1, outptr);
fread(&Header.Reserve1, 2, 1, inptr);
fwrite(&Header.Reserve1, 2, 1, outptr);
fread(&Header.Reserve2, 2, 1, inptr);
fwrite(&Header.Reserve2, 2, 1, outptr);
fread(&Header.Offset, 4, 1, inptr);
fwrite(&Header.Offset, 4, 1, outptr);
fread(&Header.FileSize, 4, 1, inptr);
fwrite(&Header.FileSize, 4, 1, outptr);
fread(&Header.Width, 4, 1, inptr);
fwrite(&Header.Width, 4, 1, outptr);
fread(&Header.Height, 4, 1, inptr);
fwrite(&Header.Height, 4, 1, outptr);
fread(&Header.ClrPlanes, 2, 1, inptr);
fwrite(&Header.ClrPlanes, 2, 1, outptr);
fread(&Header.BitsPerPix, 2, 1, inptr);
fwrite(&Header.BitsPerPix, 2, 1, outptr);
fread(&Header.Compression, 4, 1, inptr);
fwrite(&Header.Compression, 4, 1, outptr);
fread(&Header.ImSize, 4, 1, inptr);
fwrite(&Header.ImSize, 4, 1, outptr);
fread(&Header.XPixPerMeter, 4, 1, inptr);
fwrite(&Header.XPixPerMeter, 4, 1, outptr);
fread(&Header.YPixPerMeter, 4, 1, inptr);
fwrite(&Header.YPixPerMeter, 4, 1, outptr);
fread(&Header.ClrTBClr, 4, 1, inptr);
fwrite(&Header.ClrTBClr, 4, 1, outptr);
fread(&Header.ImpClr, 4, 1, inptr);
fwrite(&Header.ImpClr, 4, 1, outptr);
// iterate over infile's scanlines
if (Header.Compression!=24) {
printf("Error: This program only deals with 24 compressed bmp file\n");
if (threshold &0 || threshold &1.0) {
printf("Error: Threshold value is not valid\n");
else for (i=0; i&Header.W i++)
// iterate over pixels in scanline
for (j=0; j&Header.H j++)
// temporary storage
RGBTRIPLE triple,
int sum = 0;
// read RGB triple from infile
fread(&triple, sizeof(RGBTRIPLE), 1, inptr);
sum = triple.Red+triple.Green+triple.B
float ratio = sum/(RGB*MAX);
printf("(%d, %d, %d)\n", triple.Red, triple.Green, triple.Blue);
// prints rgb values for each pixel (used to check if the colours were right)
printf("ratio is: %f\n", ratio);
// gives the ratio
if (ratio&threshold) {
tripleout.Red = 0;
tripleout.Green = 0;
tripleout.Blue = 0;
// this part needs to be done
tripleout.Red = 255;
tripleout.Green = 255;
tripleout.Blue = 255;
// write RGB triple to outfile
fwrite(&tripleout, sizeof(RGBTRIPLE), 1, outptr);
fclose(inptr);
fclose(outptr);
return 0;}/* To use compile: gcc -Wall -o check2 check2.c
After compiling
./check filename.bmp thresholdvalue*/
十分谢谢你们的帮助。。现在已经接近尾声了。接下来要做 光线明暗 模糊 什么的了。。
代码直接根据图片写的,主要是长宽的设置,这样不需要知道文件头和信息头(因此长宽必须已知)。随手写的代码,没做保护,也没仔细检查内存,仅供参考。
shader三句话搞定喜闻乐见楼上写了那么多
shader搞定。
学着14L的公式做了这个。。还原度蛮高的
不会……只会。matlab处理的代码
太高端不懂哦
这么高端,图片处理
c也能写写东西??
2值化就是了。。。。
很有趣的样子
登录百度帐号推荐应用用C语言进行BMP文件的读写_Linux编程_Linux公社-Linux系统门户网站
你好,游客
用C语言进行BMP文件的读写
来源:Linux社区&
作者:carson2005
bmp是BitMap(位图)的简称,也是所有windows上图片显示的基础。所有的图片格式,都必须转换成bmp才能进行最终的显示。所以,bmp文件的读写,就变得非常重要了。然而,很多人是借助于MFC类,C# 库函数,OpenCV,OpenGL等库函数进行bmp文件的读写。试想一下,如果你要在诸如DSP、FPGA之类的嵌入式设备上进行bmp文件的读写,总不能去安装一个庞大的MFC,C#类库吧?其实,我们完全可以抛开这些庞杂繁琐的类库和API函数,仅仅利用C语言,编写几个函数,就完全可以实现bmp文件的读写了。本文的意图正在于此。
一个完整的bmp位图文件,可以分为文件信息头,位图信息头和RGB颜色阵列三个部分。文件信息头主要包含“是否是BMP文件”,文件的大小等信息。而位图信息头则主要包含bmp文件的位图宽度,高度,位平面,通道数等信息。而RGB颜色阵列,里面才真正包含我们所需要的bmp位图的像素数据。需要提醒的是,bmp位图的颜色阵列部分,像素数据的存储是以左下角为原点。也就是说,当你打开一个bmp图片并显示在电脑屏幕上的时,实际在存储的时候,这个图片的最左下角的像素是首先被存储在bmp文件中的。之后,按照从左到右,从下到上的顺序,依次进行像素数据的存储。如果,你存储的是3通道的位图数据(也就是我们通常说的彩图),那么它是按照B0G0R0B1G1R1B2G2R2...的顺序进行存储的,同时,还要考虑到4字节对齐的问题。OK,了解了这些基本概念,相信,自己编程实现一些bmp文件的读写函数并非难事。这里,我给出C语言的版本,仅供参考,如有错误,欢迎指正。
chenLeeCV.h&&
#ifndef&CHENLEECV_H &&
#define&CHENLEECV_H &&
typedef&struct&&
&&&&unsigned&long&&&&bfS&&
&&&&unsigned&short&&&&bfReserved1;&&
&&&&unsigned&short&&&&bfReserved2;&&
&&&&unsigned&long&&&&bfOffB&&
}&ClBitMapFileH&&
typedef&struct&&
&&&&unsigned&long&&biS&&&
&&&&long&&&biW&&&
&&&&long&&&biH&&&
&&&&unsigned&short&&&biP&&&
&&&&unsigned&short&&&biBitC&&
&&&&unsigned&long&&biC&&&
&&&&unsigned&long&&biSizeI&&&
&&&&long&&&biXPelsPerM&&&
&&&&long&&&biYPelsPerM&&&
&&&&unsigned&long&&&biClrU&&&
&&&&unsigned&long&&&biClrI&&&
}&ClBitMapInfoH&&
typedef&struct&&&
&&&&unsigned&char&rgbB&&&
&&&&unsigned&char&rgbG&&&
&&&&unsigned&char&rgbR&&&
&&&&unsigned&char&rgbR&&&
}&ClRgbQ&&
typedef&struct&&
&&&&int&&&
&&&&int&&&
&&&&int&&&
&&&&unsigned&char*&imageD&&
ClImage*&clLoadImage(char*&path);&&
bool&clSaveImage(char*&path,&ClImage*&bmpImg);&&
chenLeeCV.cpp&&
#include&"chenLeeCV.h" &&
#include&&stdio.h& &&
#include&&stdlib.h& &&
ClImage*&clLoadImage(char*&path)&&
&&&&ClImage*&bmpI&&
&&&&FILE*&pF&&
&&&&unsigned&short&fileT&&
&&&&ClBitMapFileHeader&bmpFileH&&
&&&&ClBitMapInfoHeader&bmpInfoH&&
&&&&int&channels&=&1;&&
&&&&int&width&=&0;&&
&&&&int&height&=&0;&&
&&&&int&step&=&0;&&
&&&&int&offset&=&0;&&
&&&&unsigned&char&pixV&&
&&&&ClRgbQuad*&&&
&&&&int&i,&j,&k;&&
&&&&bmpImg&=&(ClImage*)malloc(sizeof(ClImage));&&
&&&&pFile&=&fopen(path,&"rb");&&
&&&&if&(!pFile)&&
&&&&&&&&free(bmpImg);&&
&&&&&&&&return&NULL;&&
&&&&fread(&fileType,&sizeof(unsigned&short),&1,&pFile);&&
&&&&if&(fileType&==&0x4D42)&&
&&&&&&&&&&
&&&&&&&&fread(&bmpFileHeader,&sizeof(ClBitMapFileHeader),&1,&pFile);&&
&&&&&&&&fread(&bmpInfoHeader,&sizeof(ClBitMapInfoHeader),&1,&pFile);&&
&&&&&&&&if&(bmpInfoHeader.biBitCount&==&8)&&
&&&&&&&&{&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&channels&=&1;&&
&&&&&&&&&&&&width&=&bmpInfoHeader.biW&&
&&&&&&&&&&&&height&=&bmpInfoHeader.biH&&
&&&&&&&&&&&&offset&=&(channels*width)%4;&&
&&&&&&&&&&&&if&(offset&!=&0)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&offset&=&4&-&&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&bmpImg-&width&=&&&
&&&&&&&&&&&&bmpImg-&height&=&&&
&&&&&&&&&&&&bmpImg-&channels&=&1;&&
&&&&&&&&&&&&bmpImg-&imageData&=&(unsigned&char*)malloc(sizeof(unsigned&char)*width*height);&&
&&&&&&&&&&&&step&=&channels*&&
&&&&&&&&&&&&quad&=&(ClRgbQuad*)malloc(sizeof(ClRgbQuad)*256);&&
&&&&&&&&&&&&fread(quad,&sizeof(ClRgbQuad),&256,&pFile);&&
&&&&&&&&&&&&free(quad);&&
&&&&&&&&&&&&for&(i=0;&i&&i++)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&for&(j=0;&j&&j++)&&
&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&fread(&pixVal,&sizeof(unsigned&char),&1,&pFile);&&
&&&&&&&&&&&&&&&&&&&&bmpImg-&imageData[(height-1-i)*step+j]&=&pixV&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&if&(offset&!=&0)&&
&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&for&(j=0;&j&&j++)&&
&&&&&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&&&&&fread(&pixVal,&sizeof(unsigned&char),&1,&pFile);&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&}&&&&&&&&&&&&&
&&&&&&&&}&&
&&&&&&&&else&if&(bmpInfoHeader.biBitCount&==&24)&&
&&&&&&&&{&&
&&&&&&&&&&&&&&
&&&&&&&&&&&&channels&=&3;&&
&&&&&&&&&&&&width&=&bmpInfoHeader.biW&&
&&&&&&&&&&&&height&=&bmpInfoHeader.biH&&
&&&&&&&&&&&&bmpImg-&width&=&&&
&&&&&&&&&&&&bmpImg-&height&=&&&
&&&&&&&&&&&&bmpImg-&channels&=&3;&&
&&&&&&&&&&&&bmpImg-&imageData&=&(unsigned&char*)malloc(sizeof(unsigned&char)*width*3*height);&&
&&&&&&&&&&&&step&=&channels*&&
&&&&&&&&&&&&offset&=&(channels*width)%4;&&
&&&&&&&&&&&&if&(offset&!=&0)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&offset&=&4&-&&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&for&(i=0;&i&&i++)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&for&(j=0;&j&&j++)&&
&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&for&(k=0;&k&3;&k++)&&
&&&&&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&&&&&fread(&pixVal,&sizeof(unsigned&char),&1,&pFile);&&
&&&&&&&&&&&&&&&&&&&&&&&&bmpImg-&imageData[(height-1-i)*step+j*3+k]&=&pixV&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&&&&&&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&if&(offset&!=&0)&&
&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&for&(j=0;&j&&j++)&&
&&&&&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&&&&&fread(&pixVal,&sizeof(unsigned&char),&1,&pFile);&&
&&&&&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&return&bmpI&&
bool&clSaveImage(char*&path,&ClImage*&bmpImg)&&
&&&&FILE&*pF&&
&&&&unsigned&short&fileT&&
&&&&ClBitMapFileHeader&bmpFileH&&
&&&&ClBitMapInfoHeader&bmpInfoH&&
&&&&int&&&
&&&&int&&&
&&&&unsigned&char&pixVal&=&'\0';&&
&&&&int&i,&j;&&
&&&&ClRgbQuad*&&&
&&&&pFile&=&fopen(path,&"wb");&&
&&&&if&(!pFile)&&
&&&&&&&&return&false;&&
&&&&fileType&=&0x4D42;&&
&&&&fwrite(&fileType,&sizeof(unsigned&short),&1,&pFile);&&
&&&&if&(bmpImg-&channels&==&3)&&
&&&&&&&&step&=&bmpImg-&channels*bmpImg-&&&
&&&&&&&&offset&=&step%4;&&
&&&&&&&&if&(offset&!=&4)&&
&&&&&&&&{&&
&&&&&&&&&&&&step&+=&4-&&
&&&&&&&&}&&
&&&&&&&&bmpFileHeader.bfSize&=&bmpImg-&height*step&+&54;&&
&&&&&&&&bmpFileHeader.bfReserved1&=&0;&&
&&&&&&&&bmpFileHeader.bfReserved2&=&0;&&
&&&&&&&&bmpFileHeader.bfOffBits&=&54;&&
&&&&&&&&fwrite(&bmpFileHeader,&sizeof(ClBitMapFileHeader),&1,&pFile);&&
&&&&&&&&bmpInfoHeader.biSize&=&40;&&
&&&&&&&&bmpInfoHeader.biWidth&=&bmpImg-&&&
&&&&&&&&bmpInfoHeader.biHeight&=&bmpImg-&&&
&&&&&&&&bmpInfoHeader.biPlanes&=&1;&&
&&&&&&&&bmpInfoHeader.biBitCount&=&24;&&
&&&&&&&&bmpInfoHeader.biCompression&=&0;&&
&&&&&&&&bmpInfoHeader.biSizeImage&=&bmpImg-&height*&&
&&&&&&&&bmpInfoHeader.biXPelsPerMeter&=&0;&&
&&&&&&&&bmpInfoHeader.biYPelsPerMeter&=&0;&&
&&&&&&&&bmpInfoHeader.biClrUsed&=&0;&&
&&&&&&&&bmpInfoHeader.biClrImportant&=&0;&&
&&&&&&&&fwrite(&bmpInfoHeader,&sizeof(ClBitMapInfoHeader),&1,&pFile);&&
&&&&&&&&for&(i=bmpImg-&height-1;&i&-1;&i--)&&
&&&&&&&&{&&
&&&&&&&&&&&&for&(j=0;&j&bmpImg-&&j++)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&pixVal&=&bmpImg-&imageData[i*bmpImg-&width*3+j*3];&&
&&&&&&&&&&&&&&&&fwrite(&pixVal,&sizeof(unsigned&char),&1,&pFile);&&
&&&&&&&&&&&&&&&&pixVal&=&bmpImg-&imageData[i*bmpImg-&width*3+j*3+1];&&
&&&&&&&&&&&&&&&&fwrite(&pixVal,&sizeof(unsigned&char),&1,&pFile);&&
&&&&&&&&&&&&&&&&pixVal&=&bmpImg-&imageData[i*bmpImg-&width*3+j*3+2];&&
&&&&&&&&&&&&&&&&fwrite(&pixVal,&sizeof(unsigned&char),&1,&pFile);&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&if&(offset!=0)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&for&(j=0;&j&&j++)&&
&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&pixVal&=&0;&&
&&&&&&&&&&&&&&&&&&&&fwrite(&pixVal,&sizeof(unsigned&char),&1,&pFile);&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&else&if&(bmpImg-&channels&==&1)&&
&&&&&&&&step&=&bmpImg-&&&
&&&&&&&&offset&=&step%4;&&
&&&&&&&&if&(offset&!=&4)&&
&&&&&&&&{&&
&&&&&&&&&&&&step&+=&4-&&
&&&&&&&&}&&
&&&&&&&&bmpFileHeader.bfSize&=&54&+&256*4&+&bmpImg-&&&
&&&&&&&&bmpFileHeader.bfReserved1&=&0;&&
&&&&&&&&bmpFileHeader.bfReserved2&=&0;&&
&&&&&&&&bmpFileHeader.bfOffBits&=&54&+&256*4;&&
&&&&&&&&fwrite(&bmpFileHeader,&sizeof(ClBitMapFileHeader),&1,&pFile);&&
&&&&&&&&bmpInfoHeader.biSize&=&40;&&
&&&&&&&&bmpInfoHeader.biWidth&=&bmpImg-&&&
&&&&&&&&bmpInfoHeader.biHeight&=&bmpImg-&&&
&&&&&&&&bmpInfoHeader.biPlanes&=&1;&&
&&&&&&&&bmpInfoHeader.biBitCount&=&8;&&
&&&&&&&&bmpInfoHeader.biCompression&=&0;&&
&&&&&&&&bmpInfoHeader.biSizeImage&=&bmpImg-&height*&&
&&&&&&&&bmpInfoHeader.biXPelsPerMeter&=&0;&&
&&&&&&&&bmpInfoHeader.biYPelsPerMeter&=&0;&&
&&&&&&&&bmpInfoHeader.biClrUsed&=&256;&&
&&&&&&&&bmpInfoHeader.biClrImportant&=&256;&&
&&&&&&&&fwrite(&bmpInfoHeader,&sizeof(ClBitMapInfoHeader),&1,&pFile);&&
&&&&&&&&quad&=&(ClRgbQuad*)malloc(sizeof(ClRgbQuad)*256);&&
&&&&&&&&for&(i=0;&i&256;&i++)&&
&&&&&&&&{&&
&&&&&&&&&&&&quad[i].rgbBlue&=&i;&&
&&&&&&&&&&&&quad[i].rgbGreen&=&i;&&
&&&&&&&&&&&&quad[i].rgbRed&=&i;&&
&&&&&&&&&&&&quad[i].rgbReserved&=&0;&&
&&&&&&&&}&&
&&&&&&&&fwrite(quad,&sizeof(ClRgbQuad),&256,&pFile);&&
&&&&&&&&free(quad);&&
&&&&&&&&for&(i=bmpImg-&height-1;&i&-1;&i--)&&
&&&&&&&&{&&
&&&&&&&&&&&&for&(j=0;&j&bmpImg-&&j++)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&pixVal&=&bmpImg-&imageData[i*bmpImg-&width+j];&&
&&&&&&&&&&&&&&&&fwrite(&pixVal,&sizeof(unsigned&char),&1,&pFile);&&
&&&&&&&&&&&&}&&
&&&&&&&&&&&&if&(offset!=0)&&
&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&for&(j=0;&j&&j++)&&
&&&&&&&&&&&&&&&&{&&
&&&&&&&&&&&&&&&&&&&&pixVal&=&0;&&
&&&&&&&&&&&&&&&&&&&&fwrite(&pixVal,&sizeof(unsigned&char),&1,&pFile);&&
&&&&&&&&&&&&&&&&}&&
&&&&&&&&&&&&}&&
&&&&&&&&}&&
&&&&fclose(pFile);&&
&&&&return&true;&&
Main.cpp&&
#include&"stdafx.h" &&
#include&"chenLeeCV.h" &&
int&_tmain(int&argc,&_TCHAR*&argv[])&&
&&&&ClImage*&img&=&clLoadImage("c:/test.bmp");&&
&&&&bool&flag&=&clSaveImage("c:/result.bmp",&img);&&
&&&&if(flag)&&
&&&&&&&&printf("save&ok...&\n");&&
&&&&while(1);&&
&&&&return&0;&&
相关资讯 & & &
& (02月26日)
& (12/27/:56)
& (05月09日)
& (12/28/:34)
& (11/22/:35)
   同意评论声明
   发表
尊重网上道德,遵守中华人民共和国的各项有关法律法规
承担一切因您的行为而直接或间接导致的民事或刑事法律责任
本站管理人员有权保留或删除其管辖留言中的任意内容
本站有权在网站内转载或引用您的评论
参与本评论即表明您已经阅读并接受上述条款
断桥碧草 发表于 308和252行程序错误,应把offset改成4-offset
(1) 断桥碧草 发表于 程序有错误:252行308行for (j=0; j& j++) 应改为for (j=0; j&4- j++)
(1) 草原户 发表于 : fatal error C1083: Cannot open include file: 'chenLeeCV.h': No such file or directory
(1) 匿名 发表于
: fatal error C1083: Cannot open include file: ' chenLeeCV.h ': No such file or directory执行 cl.exe 时出错.
(4) 谢 发表于 这个程序里有木马,是故意的吗用c语言读取并显示bmp图像1_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
用c语言读取并显示bmp图像1
阅读已结束,下载文档到电脑
想免费下载更多文档?
定制HR最喜欢的简历
下载文档到电脑,方便使用
还剩35页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢欢迎加入我们,一同切磋技术。 &
用户名: &&&
密 码: &
共有 2583 人关注过本帖
标题:关于读取BMP图片文件的C程序的问题,求大大指教
等 级:新手上路
帖 子:29
结帖率:75%
&&已结贴√
&&问题点数:20&&回复次数:4&&&
关于读取BMP图片文件的C程序的问题,求大大指教
#include &string.h&
#include &math.h&
#include &stdio.h&
#include &stdlib.h&
#include &malloc.h&
#define WIDTHBYTES(bits) (((bits)+31)/32*4)
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
//位图文件头信息结构定义
//其中不包含文件类型信息(由于结构体的内存结构决定,要是加了的话将不能正确读取文件信息)
typedef struct tagBITMAPFILEHEADER {
DWORD bfS //文件大小
WORD bfReserved1; //保留字,不考虑
WORD bfReserved2; //保留字,同上
DWORD bfOffB //实际位图数据的偏移字节数,即前三个部分长度之和
} BITMAPFILEHEADER;
//信息头BITMAPINFOHEADER,也是一个结构,其定义如下:
typedef struct tagBITMAPINFOHEADER{
DWORD biS //指定此结构体的长度,为40
LONG biW //位图宽
LONG biH //位图高
WORD biP //平面数,为1
WORD biBitC //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32
DWORD biC //压缩方式,可以是0,1,2,其中0表示不压缩
DWORD biSizeI //实际位图数据占用的字节数
LONG biXPelsPerM //X方向分辨率
LONG biYPelsPerM //Y方向分辨率
DWORD biClrU //使用的颜色数,如果为0,则表示默认值(2^颜色位数)
DWORD biClrI //重要颜色数,如果为0,则表示所有颜色都是重要的
} BITMAPINFOHEADER;
//调色板Palette,当然,这里是对那些需要调色板的位图文件而言的。24位和32位是不需要调色板的。
//(似乎是调色板结构体个数等于使用的颜色数。)
typedef struct tagRGBQUAD {
BYTE rgbB //该颜色的蓝色分量
BYTE rgbG //该颜色的绿色分量
BYTE rgbR //该颜色的红色分量
BYTE rgbR //保留值
} RGBQUAD;
void showBmpHead(BITMAPFILEHEADER* pBmpHead)&&//显示文件头信息
printf(&位图文件头:\n&);
printf(&文件大小:%d\n&,pBmpHead-&bfSize);
printf(&保留字:%d\n&,pBmpHead-&bfReserved1);
printf(&保留字:%d\n&,pBmpHead-&bfReserved2);
printf(&实际位图数据的偏移字节数:%d\n&,pBmpHead-&bfOffBits);
void showBmpInforHead(tagBITMAPINFOHEADER* pBmpInforHead)
printf(&位图信息头:\n&);
printf(&结构体的长度:%d\n&,pBmpInforHead-&biSize);
printf(&位图宽:%d\n&,pBmpInforHead-&biWidth);
printf(&位图高:%d\n&,pBmpInforHead-&biHeight);
printf(&biPlanes平面数:%d\n&,pBmpInforHead-&biPlanes);
printf(&biBitCount采用颜色位数:%d\n&,pBmpInforHead-&biBitCount);
printf(&压缩方式:%d\n&,pBmpInforHead-&biCompression);
printf(&biSizeImage实际位图数据占用的字节数:%d\n&,pBmpInforHead-&biSizeImage);
printf(&X方向分辨率:%d\n&,pBmpInforHead-&biXPelsPerMeter);
printf(&Y方向分辨率:%d\n&,pBmpInforHead-&biYPelsPerMeter);
printf(&使用的颜色数:%d\n&,pBmpInforHead-&biClrUsed);
printf(&重要颜色数:%d\n&,pBmpInforHead-&biClrImportant);
void showRgbQuan(tagRGBQUAD* pRGB)&&&//这是干嘛的?
printf(&(%-3d,%-3d,%-3d) &,pRGB-&rgbRed,pRGB-&rgbGreen,pRGB-&rgbBlue);
void main()
BITMAPFILEHEADER bitH
BITMAPINFOHEADER bitInfoH
char strFile[50];
printf(&please input the .bmp file name:\n&);
scanf(&%s&,strFile);
pfile = fopen(strFile,&rb&);//打开文件
if(pfile!=NULL)
printf(&file bkwood.bmp open success.\n&);
//读取位图文件头信息
WORD fileT
fread(&fileType,1,sizeof(WORD),pfile);
if(fileType != 0x4D42)&&& //就这句,0x4D42是BM的ASCII码,为什么明明读取的BMP图像,头文件标志是BM,但还是不行
printf(&file is not .bmp file!&);
fseek(pfile,2,SEEK_CUR); // &BM&
fread(&bitHead,1,sizeof(tagBITMAPFILEHEADER),pfile);
showBmpHead(&bitHead);
printf(&\n\n&);
//读取位图信息头信息
fread(&bitInfoHead,1,sizeof(BITMAPINFOHEADER),pfile);
showBmpInforHead(&bitInfoHead);
printf(&\n&);
printf(&file open fail!\n&);
tagRGBQUAD *pR
if(bitInfoHead.biBitCount & 24)//有调色板
//读取调色盘结信息
long nPlantNum = long(pow(2,double(bitInfoHead.biBitCount))); // Mix color Plant N
pRgb=(tagRGBQUAD *)malloc(nPlantNum*sizeof(tagRGBQUAD));
memset(pRgb,0,nPlantNum*sizeof(tagRGBQUAD));
int num = fread(pRgb,4,nPlantNum,pfile);
printf(&Color Plate Number: %d\n&,nPlantNum);
printf(&颜色板信息:\n&);
for (int i =0; i&nPlantNi++)
if (i%5==0)
printf(&\n&);
showRgbQuan(&pRgb[i]);
printf(&\n&);
int width = bitInfoHead.biW
int height = bitInfoHead.biH
//分配内存空间把源图存入内存
int l_width = WIDTHBYTES(width* bitInfoHead.biBitCount);//计算位图的实际宽度并确保它为32的倍数
BYTE *pColorData=(BYTE *)malloc(height*l_width);
memset(pColorData,0,height*l_width);
long nData = height*l_
//把位图数据信息读到数组里
fread(pColorData,1,nData,pfile);
//将位图数据转化为RGB数据
tagRGBQUAD* dataOfB
dataOfBmp = (tagRGBQUAD *)malloc(width*height*sizeof(tagRGBQUAD));//用于保存各像素对应的RGB数据
memset(dataOfBmp,0,width*height*sizeof(tagRGBQUAD));
if(bitInfoHead.biBitCount&24)//有调色板,即位图为非真彩色
int index = 0;
if (bitInfoHead.biBitCount == 1)
for(int i=0;i&i++)
for(int j=0;j&j++)
BYTE mixIndex= 0;
k = i*l_width + j/8;//k:取得该像素颜色数据在实际数据数组中的序号
//j:提取当前像素的颜色的具体值
mixIndex = pColorData[k];
switch(j%8)
mixIndex = mixIndex&&7;
mixIndex = mixIndex&&7;
mixIndex = mixIndex&&6;
mixIndex = mixIndex&&7;
mixIndex = mixIndex&&5;
mixIndex = mixIndex&&7;
mixIndex = mixIndex&&4;
mixIndex = mixIndex&&7;
mixIndex = mixIndex&&3;
mixIndex = mixIndex&&7;
mixIndex = mixIndex&&2;
mixIndex = mixIndex&&7;
mixIndex = mixIndex&&1;
mixIndex = mixIndex&&7;
mixIndex = mixIndex&&7;
//将像素数据保存到数组中对应的位置
dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbR
dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbG
dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbB
dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbR
if(bitInfoHead.biBitCount==2)
for(int i=0;i&i++)
for(int j=0;j&j++)
BYTE mixIndex= 0;
k = i*l_width + j/4;//k:取得该像素颜色数据在实际数据数组中的序号
//j:提取当前像素的颜色的具体值
mixIndex = pColorData[k];
switch(j%4)
mixIndex = mixIndex&&6;
mixIndex = mixIndex&&6;
mixIndex = mixIndex&&4;
mixIndex = mixIndex&&6;
mixIndex = mixIndex&&2;
mixIndex = mixIndex&&6;
mixIndex = mixIndex&&6;
//将像素数据保存到数组中对应的位置
dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbR
dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbG
dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbB
dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbR
if(bitInfoHead.biBitCount == 4)
for(int i=0;i&i++)
for(int j=0;j&j++)
BYTE mixIndex= 0;
k = i*l_width + j/2;
mixIndex = pColorData[k];
if(j%2==0)
mixIndex = mixIndex&&4;
mixIndex = mixIndex&&4;
mixIndex = mixIndex&&4;
dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbR
dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbG
dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbB
dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbR
if(bitInfoHead.biBitCount == 8)
for(int i=0;i&i++)
for(int j=0;j&j++)
BYTE mixIndex= 0;
k = i*l_width +
mixIndex = pColorData[k];
dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbR
dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbG
dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbB
dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbR
if(bitInfoHead.biBitCount == 16)
for(int i=0;i&i++)
for(int j=0;j&j++)
WORD mixIndex= 0;
k = i*l_width + j*2;
WORD shortT
shortTemp = pColorData[k+1];
shortTemp = shortTemp&&8;
mixIndex = pColorData[k] + shortT
dataOfBmp[index].rgbRed = pRgb[mixIndex].rgbR
dataOfBmp[index].rgbGreen = pRgb[mixIndex].rgbG
dataOfBmp[index].rgbBlue = pRgb[mixIndex].rgbB
dataOfBmp[index].rgbReserved = pRgb[mixIndex].rgbR
else//位图为24位真彩色
int index = 0;
for(int i=0;i&i++)
for(int j=0;j&j++)
k = i*l_width + j*3;
dataOfBmp[index].rgbRed = pColorData[k+2];
dataOfBmp[index].rgbGreen = pColorData[k+1];
dataOfBmp[index].rgbBlue = pColorData[k];
printf(&像素数据信息:\n&);
for (int i=0; i&width* i++)
if (i%5==0)
printf(&\n&);
showRgbQuan(&dataOfBmp[i]);
fclose(pfile);
if (bitInfoHead.biBitCount&24)
free(pRgb);
free(dataOfBmp);
free(pColorData);
printf(&\n&);
[ 本帖最后由 jackienupt 于
21:05 编辑 ]
搜索更多相关主题的帖子:
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
注意颜色设置,不同色深的BMP图片的数据尺寸是不一样的。
授人以渔,不授人以鱼。
等 级:贵宾
威 望:304
帖 子:25793
专家分:48814
&&得分:20&
一般影响你读取数据并解析输出的因素,主要是以下两个,你的程序要先判断这两个参数到底是什么:
WORD biBitC //采用颜色位数,可以是1,2,4,8,16,24,新的可以是32
DWORD biC //压缩方式,可以是0,1,2,其中0表示不压缩
大概扫描你的代码,主要是读24位颜色图像的,如果实际图像不是这个格式的,这个代码就不适用了。其实,如果是在Windows中,已经不需要这样自己解释图像数据了,API装入并显示图像的速度比你自己写的高效得多,而且几乎所有流行图像格式都能处理,而你这个只能处理特定格式的BMP。当然,要练手那是另一回事。
授人以渔,不授人以鱼。
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
哇 这个完全不懂,学习。
                                                       
等 级:新手上路
帖 子:29
回复 3楼 TonyDeng
恩,谢了啊,你回答的比较认真。这代码是对的,主要是我跑程序时,读取的图片是伪BMP格式,所以那句判断格式会出错
版权所有,并保留所有权利。
Powered by , Processed in 0.271611 second(s), 7 queries.
Copyright&, BCCN.NET, All Rights Reserved}

我要回帖

更多关于 c语言二维数组排序 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信