使用C语言实现对bmp图像的部分更改
fseek 偏移指针
函数详情介绍如下:
int fseek(FILE *stream, long offset, int whence);
功能:用来设置光标的位置
参数:
@stream:文件指针
@offset:设置到哪里(偏移)
>0 向后偏移
=0 不偏移
<0 向前偏移
@whence:从哪里开始设置
SEEK_SET:开头
SEEK_CUR:当前位置
SEEK_END :结尾
返回值:成功返回0,失败返回-1置位错误码
更改前图片
#include <head.h>
typedef struct picture {
unsigned int size; //大小
unsigned int offset; //头文件开始到实际的图像数据之间的字节偏移量
unsigned int width; //文件的宽
unsigned int high; //文件的高
unsigned short pix; //文件的像素点
} p_t;
typedef struct {
unsigned char B; //蓝
unsigned char G; //绿
unsigned char R; //红
} RGB_t;
void get_picture_head_info(FILE* fp, p_t* info)
{
fseek(fp, 2, SEEK_SET);
fread(&info->size, 4, 1, fp);
fseek(fp, 10, SEEK_SET);
fread(&info->offset, 4, 1, fp);
fseek(fp, 18, SEEK_SET);
fread(&info->width, 4, 1, fp);
fread(&info->high, 4, 1, fp);
fseek(fp, 2, SEEK_CUR);
fread(&info->pix, 2, 1, fp);
}
void show_picture_head_info(p_t* info)
{
printf("size=%d,offset=%d,width=%d,high=%d,pix=%d\n", info->size, info->offset, info->width, info->high, info->pix);
}
int main(int argc, const char* argv[])
{
FILE* fp;
p_t info;
RGB_t rgb;
if (argc != 2) {
fprintf(stderr, "input erroe,try again\n");
fprintf(stderr, "usage: ./a.out picturename\n");
return -1;
}
if ((fp = fopen(argv[1], "r+")) == NULL)
PRINT_ERR("fopen error");
get_picture_head_info(fp, &info);
show_picture_head_info(&info);
fseek(fp, 54, SEEK_SET); //将光标移动到图像数据位
fread(&rgb, 3, 1, fp); //在fp中从rgb开始读,每次读3字节,读一组
printf("B=%d,G=%d,R=%d\n", rgb.B, rgb.G, rgb.R); // 255 255 255说明此时为白色
memset(&rgb, 0, sizeof(rgb));
rgb.B = 255;
int sum = 1092000 + 840;
fseek(fp, sum, SEEK_SET);
for (int i = 0; i < 40; i++) {
for (int j = 0; j < 45; j++) {
fwrite(&rgb, 3, 1, fp);
}
fseek(fp, sum = sum + 2100, SEEK_SET);
}
fclose(fp);
return 0;
}
更改后图像