#include <stdio.h>
unsigned char bin[5*1024*1024];
int main(int argc, char *argv[])
{
int way = 0; // 方法变量,0:为修改调色板;1:为修改位图内容
if (argc < 2)
{
printf("请输入图片路径\n");
return -__LINE__;
}
if (argc >= 3)
{
if (argv[2][0] == '0')
{
way = 0;
}
else if (argv[2][0] == '1')
{
way = 1;
}
}
FILE *fp = fopen(argv[1], "rb");
if (fp == NULL)
{
printf("打开文件失败\n");
return -__LINE__;
}
int filesize = fread(bin, 1, sizeof(bin), fp);
if (filesize <= 0)
{
printf("文件读取失败\n");
return -__LINE__;
}
fclose(fp);
if (way == 0)
{ // 修改bmp位图的调色板
for (int i = 0; i < 4; i++)
{
int tmp = bin[54 + i];
bin[54 + i] = bin[58 + i];
bin[58 + i] = tmp;
}
}
else if (way == 1)
{ // 修改位图的内容
int w = bin[18] | (bin[19] << 8) | (bin[20] << 16) | (bin[21]<<24);
int h = bin[22] | (bin[23] << 8) | (bin[24] << 16) | (bin[25]<<24);
printf("位图宽度为:%d,高度为:%d\n", w, h);
int w1 = 32 * ((w + 31) / 32); // 一行所需要的bit数
for (int i = 0; i < h; i++)
{
for (int j = 0; j < w; j++)
{
int offset = i * w1 + j; // 偏移的点数
bin[62 + offset / 8] ^= (0x80 >> (offset % 8));
}
}
}
fp = fopen(argv[1], "wb");
if (fp == NULL)
{
printf("再次打开文件失败\n");
return -__LINE__;
}
if (fwrite(bin, 1, filesize, fp) < 0)
{
printf("写入文件失败\n");
return -__LINE__;
}
fclose(fp);
return 0;
}文章作者:沃航科技