改变蜡笔小新的眼睛颜色(对bmp图像的部分更改)

使用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;
}

更改后图像

在这里插入图片描述

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值