当前位置:首页 » 编程语言 » c语言怎么做位图
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言怎么做位图

发布时间: 2023-02-07 13:11:37

‘壹’ c语言如何生成位图文件

去了解位图的文件头结构和位图的数据结构,然后按照这些数据格式写成数据文件流保存成位图文件就可了。网上有比较多的C语言范例可以参考。

‘贰’ c语言 位图操作

对于一个24位色的图,你直接就拿int(32位机器,长度32位)型二维数组存就行了。肯定能存这个24位数,没必要把颜色分开存。如果分开存你就用下面的结构体数组的方法吧。建议参考,十分方便实用。

RGB24使用24位来表示一个像素,RGB分量都用8位表示,取值范围为0-255。注意在内存中RGB各分量的排列顺序为:BGR BGR BGR…。通常可以使用RGBTRIPLE数据结构来操作一个像素,它的定义为:
typedef struct tagRGBTRIPLE
{BYTE rgbtBlue; // 蓝色分量
BYTE rgbtGreen; // 绿色分量
BYTE rgbtRed; // 红色分量
} RGBTRIPLE;

‘叁’ 新手请教:c语言处理位图

你没有把文件的内容读进结构体里面,当然结果不可预料
而且,如果你直接fread(&bmfHeader, sizeof(bmfHeader), 1, fp)也可能会出错,因为编译器在编译结构体的时候,为了加快访问,会进行结构体的对齐操作。

所以你要逐一字段地读取bmp图像的信息单元

‘肆’ 用c语言读取24位位图bmp文件

可以使用C语言标准函数库中的fopen、fseek、fclose等系列函数来打开bmp位图文件,以及进行相应的处理,下面是一个demo,仅供参考。以下代码在vc6.0中编译通过。


#include<stdio.h>
#include<stdlib.h>
#//ThebmpFileHeaderlengthis14
#defineBM19778//TheASCIIcodeforBM
/*Testthefileisbmpfileornot*/
voidbmpFileTest(FILE*fpbmp);
/**/
voidbmpHeaderPartLength(FILE*fpbmp);
/**/
voidBmpWidthHeight(FILE*fpbmp);
//getr,g,bdata
voidbmpDataPart(FILE*fpbmp);
//
voidbmpoutput(FILE*fpout);
unsignedintOffSet=0;//
longwidth;//TheWidthoftheDataPart
longheight;//TheHeightoftheDataPart
unsignedcharr[2000][2000],output_r[2000][2000];
unsignedcharg[2000][2000],output_g[2000][2000];
unsignedcharb[2000][2000],output_b[2000][2000];
intmain(intargc,char*argv[])
{
/*Openbmpfile*/
unsignedchar*fp_temp;
FILE*fpbmp;
FILE*fpout;
fpbmp=fopen("1.bmp","rb");
if(fpbmp==NULL)
{
printf("Openbmpfailed!!! ");
return1;
}
fpout=fopen("out.bmp","wb+");
if(fpout==NULL)
{
printf("Openout.bmpfailed!!! ");
return1;
}

bmpFileTest(fpbmp);//Testthefileisbmpfileornot
bmpHeaderPartLength(fpbmp);//GetthelengthofHeaderPart
BmpWidthHeight(fpbmp);//


//
fseek(fpbmp,0L,SEEK_SET);
fseek(fpout,0L,SEEK_SET);

fp_temp=(unsignedchar*)malloc(OffSet);
fread(fp_temp,1,OffSet,fpbmp);
fwrite(fp_temp,1,OffSet,fpout);

bmpDataPart(fpbmp);//Reservethedatatofile

/*


如果您想对图片进行处理,请您再这里插入处理函数!!!!!!!!!!!!!!!!!!

*/
bmpoutput(fpout);
fclose(fpbmp);
fclose(fpout);
return0;
}
voidbmpoutput(FILE*fpout)
{
inti,j=0;
intstride;
unsignedchar*pixout=NULL;

stride=(24*width+31)/8;
stride=stride/4*4;
pixout=(unsignedchar*)malloc(stride);

fseek(fpout,OffSet,SEEK_SET);
for(j=0;j<height;j++)
{
for(i=0;i<width;i++)
{
pixout[i*3+2]=output_r[height-1-j][i];
pixout[i*3+1]=output_g[height-1-j][i];
pixout[i*3]=output_b[height-1-j][i];
}
fwrite(pixout,1,stride,fpout);
}
}
voidbmpDataPart(FILE*fpbmp)
{
inti,j=0;
intstride;
unsignedchar*pix=NULL;
FILE*fpr;
FILE*fpg;
FILE*fpb;

if((fpr=fopen("bmpr.txt","w+"))==NULL)
{
printf("Failedtoconstructfilebmpr.txt.!!!");
exit(1);
}
if((fpg=fopen("bmpg.txt","w+"))==NULL)
{
printf("Failedtoconstructfilebmpg.txt.!!!");
exit(1);
}
if((fpb=fopen("bmpb.txt","w+"))==NULL)
{
printf("Failedtoconstructfilebmpb.txt.!!!");
exit(1);
}

fseek(fpbmp,OffSet,SEEK_SET);
stride=(24*width+31)/8;
stride=stride/4*4;
pix=(unsignedchar*)malloc(stride);

for(j=0;j<height;j++)
{
fread(pix,1,stride,fpbmp);
for(i=0;i<width;i++)
{
r[height-1-j][i]=pix[i*3+2];
g[height-1-j][i]=pix[i*3+1];
b[height-1-j][i]=pix[i*3];
output_r[height-1-j][i]=pix[i*3+2];
output_g[height-1-j][i]=pix[i*3+1];
output_b[height-1-j][i]=pix[i*3];
}
}
for(i=0;i<height;i++)
{
for(j=0;j<width-1;j++)
{
fprintf(fpb,"%4d",b[i][j]);
fprintf(fpg,"%4d",g[i][j]);
fprintf(fpr,"%4d",r[i][j]);
}
fprintf(fpb,"%4d ",b[i][j]);
fprintf(fpg,"%4d ",g[i][j]);
fprintf(fpr,"%4d ",r[i][j]);
}

fclose(fpr);
fclose(fpg);
fclose(fpb);

}
voidbmpFileTest(FILE*fpbmp)
{
unsignedshortbfType=0;

fseek(fpbmp,0L,SEEK_SET);//seek_set起始位置
fread(&bfType,sizeof(char),2,fpbmp);
if(BM!=bfType)
{
printf("Thisfileisnotbmpfile.!!! ");
exit(1);
}
}
/**/
voidbmpHeaderPartLength(FILE*fpbmp)
{
fseek(fpbmp,10L,SEEK_SET);
fread(&OffSet,sizeof(char),4,fpbmp);
printf("TheHeaderPartisoflength%d. ",OffSet);
}
/**/
voidBmpWidthHeight(FILE*fpbmp)
{
fseek(fpbmp,18L,SEEK_SET);
fread(&width,sizeof(char),4,fpbmp);
fseek(fpbmp,22L,SEEK_SET);
fread(&height,sizeof(char),4,fpbmp);
printf("TheWidthofthebmpfileis%ld. ",width);
printf("TheHeightofthebmpfileis%ld. ",height);
}

‘伍’ 如何用C语言设计一幅图片

看你想用什么工具喽,处理图片,首先要了解的是图片储存方式,最简单的要属bmp,也就是位图,win32自带有函数可以调用操作位图,它保存的是每个点的颜色与位置,当然二进制码没有你想的那么简单,使用的好像是调色板模式储存的。最厉害的压缩图片是jpg,现在很多高清的也用它,里面的代码方式暂时不知道,不过人家提供的函数接口,可以直接调用,最后处理图片时,最难的地方就在于放大或缩小,这里需要考虑的问题是仿真技术,往深了可能难懂,简单点的就是将放大或缩小后改变的区域用原有的颜色进行渐变。 想做出类似画图的软件,还是很麻烦的,画图画线都好说,主要难在添充颜色。

‘陆’ 谁知道怎么用C语言或者C++实现多个黑白位图的拼接最后给出有关的代码,求编程大师帮助、急!!!

首先创建一个内存位图(CreateCompatibleBitmap),创建内存dc(CreateCompatibleDC),将创建好的位图选进内存DC,再将你的一张张图片画(BitBlt)到内存dc上,保存或者画出创建的位图就是你想要的拼接后的图片。

‘柒’ c语言读取位图编程

我也遇到过类似的问题,位图数据读取到内存,然后在保存的文件中。
新位图文件,虽然能够显示但是图片内容中存在大量错误。
后来发现问题的关键在于
fopen(bmpname,"rb");
注意rb标志,不管是只读标志还是只写标志,或者读写标志后面要加+。
也就是rb+
不加+的标志是针对的文本读写的。
加+的标志是针对二进制数据读写的。
而位图文件是一种二进制数据。