第一题: 寻找一个bmp图片,输出这张bmp图片第一个像素点和最后一个像素点的bgr的值
int main(int argc, const char *argv[])
{
FILE* fp=fopen("./zzz.bmp","r");
int bmp_size=0,bmp_w=0,bmp_h=0;
fseek(fp,18,SEEK_SET);
fread(&bmp_size,4,1,fp);
printf("pictures size:%d\n",bmp_size);
fseek(fp,18,SEEK_SET);
fread(&bmp_w,4,1,fp);
fread(&bmp_h,4,1,fp);
printf("pictures geshi :%d * %d\n",bmp_w , bmp_h);
fclose(fp);
// 读取第一个像素点
unsigned char bgr[3];
fseek(fp, 54, SEEK_SET); // 移动到像素数据开始位置
fread(bgr, 1, 3, fp); // 读取BGR值
printf("第一个像素点的BGR值: %d %d %d\n", bgr[2], bgr[1], bgr[0]);
// 计算最后一个像素点的位置
int width = bmp_w;
int height = bmp_h;
fseek(fp, 54+ (width * height - 1) * 3, SEEK_SET);
fread(bgr, 1, 3, fp);
printf("最后一个像素点的BGR值: %d%d%d\n", bgr[2], bgr[1], bgr[0]);
return 0;
}
第二题: 修改一张bmp图片的大小,让他的宽度*2,高度*2,也就是最终像素点的数量*4,最后使用黑色像素点填充图片扩大的部分(不要求效果,只要求代码)
int main(int argc, const char *argv[])
{
FILE* fp=fopen("aaa.bmp","r");
int w=0,h=0;
fseek(fp,18,SEEK_SET);
fread(&w,4,1,fp);
fread(&h,4,1,fp);
printf("weight:%d height:%d\n",w,h);
fclose(fp);
FILE* wfp=fopen("aaa.bmp","r+");
fseek(wfp,18,SEEK_SET);
int nw=w*2;
int nh=h*2;
fwrite(&nw,4,1,fp);
fwrite(&nw,4,1,fp);
fseek(wfp,h*w,SEEK_SET);
unsigned char bgr[3]={0,0,0};
for(int i=0;i<nh;i++)
{
for(int j=0;i<nw;j++)
{
if(i>h&&j>w)
{
fwrite(bgr,3,1,wfp);
}
}
}
fclose(wfp);
return 0;
}
第三题: 将一张bmp图片修改成德国的国旗(如下图)
int main(int argc, const char *argv[])
{
FILE* fp=fopen("zzz.bmp","r");
fseek(fp,2,SEEK_SET);
int bmp_size=0;
fread(&bmp_size,4,1,fp);
printf("size:%d\n",bmp_size);
int w=0,h=0;
fseek(fp,18,SEEK_SET);
fread(&w,4,1,fp);
fread(&h,4,1,fp);
printf("weight:%d height:%d\n",w,h);
FILE* wfp=fopen("zzz.bmp","r+");
fseek(wfp,54,SEEK_SET);
fseek(fp,54,SEEK_SET);
unsigned char b,g,r;
unsigned char bgr1[3]={0,0,0},bgr2[3]={0,0,225},bgr3[3]={0,255,255};
for(int i=0;i<h;i++)
{
for(int j=0;j<w;j++)
{
if(i==0&&j==0)
{
fread(&b,1,1,fp);
fread(&g,1,1,fp);
fread(&r,1,1,fp);
printf("first red:%d green:%d blue:%d \n",r,g,b);
}
if(i==h&&j==w)
{
fseek(fp,54+w*h-1,SEEK_SET);
fread(&b,1,1,fp);
fread(&g,1,1,fp);
fread(&r,1,1,fp);
printf("end red:%d green:%d blue:%d \n",r,g,b);
}
if(i<h/3)
{
fwrite(bgr3,3,1,wfp);
}
else if(i>h/3&&i<.3*2)
{
fwrite(bgr2,3,1,wfp);
}
else if(i>h/3*2)
{
fwrite(bgr1,3,1,wfp);
}
}
}
fclose(fp);
fclose(wfp);
return 0;
}