#include<stdio.h>
int main(void)
{
FILE *fp,*fp2;
int r,g,b;
int i,j,r19,r18;
int width=0,width_judge,width_mode;//定义标记变量,width是图像宽度,width_judge是判断行处理时是否需要考虑计算机存储补齐问题,width_mode为补齐数;
double y,u,v;
int r1,g1,b1;
char r2,g2,b2;
fp=fopen("F:\\tidus.bmp","rb");
fp2=fopen("F:\\tidus2.bmp","wb");//打开文件
if(fp==NULL||fp2==NULL)
printf("error in opening\n");
else
printf("open successfully\n");//提示文件打开成功与否
for(i=0;i<=53;i++)
{
r1=getc(fp);
if(i==19)
r19=(int)r1;
if(i==18)
r18=(int)r1;
fwrite(&r1,sizeof(char),1,fp2);
}//前53个字节包含了文件信息,所以直接复制,其中width信息存在18到21中,且倒着存的
width=width+r19*256+r18;//计算width
fseek(fp,54L,0);
fseek(fp,54L,0);
i=1;
if(width*3%4)
width_judge=0;//如果width*3个像素不能完全覆盖一个以四字节为存储单位的存储空间中,那么就要考虑计算机存储补零的问题
else
width_judge=1;
width_mode=4-(width*3)%4;
printf("width=%d,width_judge=%d\n",width,width_judge);
while(!feof(fp))
{
if(width_judge==1)
{
r=getc(fp);
g=getc(fp);
b=getc(fp);//读出RGB值
y=0.299*r+0.587*g+0.114*b;
u=-0.147*r-0.289*g+0.435*b;
v=0.615*r-0.515*g-0.100*b;//换算
y+=50;//调亮
if(y>=255)
y=255;
if(y<=0)
y=0;
r1=(int)(1.0*y+1.1398*v);
if(r1>=255)
r1=255;
if(r1<=0)
r1=0;
g1=(int)(0.9996*y-0.3954*u-0.5805*v);
if(g1>=255)
g1=255;
if(g1<=0)
g1=0;
b1=(int)(1.0020*y+2.0361*u);
if(b1>=255)
b1=255;
if(b1<=0)
b1=0;//溢出处理
r2=(char)r1;
g2=(char)g1;
b2=(char)b1;
fwrite(&r2,sizeof(char),1,fp2);//写入
fwrite(&g2,sizeof(char),1,fp2);
fwrite(&b2,sizeof(char),1,fp2);
}
if(width_judge==0)
{
if(i==width+1)//如果需要补齐,那么一行处理结束的标志是i(记录行处理已经进行的次数)等于width+1,那么这个时候就使i归一就可以标志着开始处理另一行
{
for(j=0;j<width_mode;j++)
{
r=getc(fp);//补的零直接写入
fwrite(&r,sizeof(char),1,fp2);
}
i=1;
}
else//此段处理与上同,最后记录次数的i要自增
{
r=getc(fp);
g=getc(fp);
b=getc(fp);
y=0.299*r+0.587*g+0.114*b;
u=-0.147*r-0.289*g+0.435*b;
v=0.615*r-0.515*g-0.100*b;
y+=50;
if(y>=255)
y=255;
if(y<=0)
y=0;
r1=(int)(1.0*y+1.1398*v);
if(r1>=255)
r1=255;
if(r1<=0)
r1=0;
g1=(int)(0.9996*y-0.3954*u-0.5805*v);
if(g1>=255)
g1=255;
if(g1<=0)
g1=0;
b1=(int)(1.0020*y+2.0361*u);
if(b1>=255)
b1=255;
if(b1<=0)
b1=0;
r2=(char)r1;
g2=(char)g1;
b2=(char)b1;
fwrite(&r2,sizeof(char),1,fp2);
fwrite(&g2,sizeof(char),1,fp2);
fwrite(&b2,sizeof(char),1,fp2);
i++;
}
}
}
getchar();
fclose(fp);
fclose(fp2);
}
没有合适的资源?快使用搜索试试~ 我知道了~
用C语言调节BMP图的亮度
共26个文件
tlog:9个
pdb:2个
sdf:1个
4星 · 超过85%的资源 需积分: 39 77 下载量 23 浏览量
2011-09-20
18:01:07
上传
评论 2
收藏 560KB RAR 举报
温馨提示
在F盘中放入名为TIDUS的BMP图,运行文件可以看到效果了
资源推荐
资源详情
资源评论
收起资源包目录
TIDUS.rar (26个子文件)
TIDUS
Debug
TIDUS.pdb 371KB
TIDUS.exe 30KB
TIDUS.ilk 318KB
ipch
tidus-7715b638
tidus-e03cf855.ipch 1.38MB
TIDUS.sdf 1.58MB
TIDUS.suo 11KB
TIDUS.sln 882B
TIDUS
Debug
cl.command.1.tlog 660B
CL.read.1.tlog 1KB
vc100.idb 35KB
mt.read.1.tlog 836B
link.read.1.tlog 2KB
tidus.obj 14KB
TIDUS.lastbuildstate 86B
link.write.1.tlog 832B
CL.write.1.tlog 484B
vc100.pdb 60KB
TIDUS.exe.intermediate.manifest 381B
link.command.1.tlog 1KB
TIDUS.log 3KB
mt.write.1.tlog 364B
mt.command.1.tlog 536B
TIDUS.vcxproj.filters 943B
TIDUS.vcxproj.user 143B
tidus.cpp 3KB
TIDUS.vcxproj 3KB
共 26 条
- 1
OPPOTIDUS
- 粉丝: 0
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
- 1
- 2
前往页