Инвертирование цветов в 1-битном BMP-файле размером 32x32
Все вопросы можно задавать по адресу staroverovvl@yandex.ru
В программе считывается BMP-файл, имя которого задается в командной строке,
цвета изобажения инвертируются и измененный файл записывается в файл
с именем t.bmp. Далее файл t.bmp копируется обратно
в файл с заданным именем.
//Данный include требуется только в Microsoft Visual Studio:
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <stdio.h>
#pragma warning (disable:4996)//запрещает излишние замечания
int _tmain(int argc, _TCHAR* argv[])
{
char c;int i,j;unsigned long ptr;
FILE *f,*f2;
unsigned char ss[4];
if(argc!=2){printf("Call:\nBMP FileName\n");return -1;}
f=fopen(argv[1],"rb");f2=fopen("t.bmp","wb"); //Читаем из фала с именем из командной строки и записываем в файл t.bmp
if(f==NULL){printf("Can't open file\n");return -1;}
//--
for(i=0;i<10;i++){fread(&c,1,1,f);fwrite(&c,1,1,f2);} //читаем 10 байт
fread(&ptr,sizeof(ptr),1,f);fwrite(&ptr,sizeof(ptr),1,f2);//читаем смещение к данным картинки
for(i=0;i<(int)(ptr-10-sizeof(ptr));i++) //читаем оставшиеся байты до картинки
{fread(&c,1,1,f);fwrite(&c,1,1,f2);}
for(i=0;i<32;i++)//читаем строки изображения и инвертируем цвета:
{
fread(ss,sizeof(ss),1,f);//32 пиксела по 1 биту на пиксел должны размещаться в 4 байтах
{
for(j=0;j<4;j++)
ss[j]=~ss[j];
}
fwrite(ss,sizeof(ss),1,f2);
}
//--
fclose(f);fclose(f2);
//-- Копируем t.bmp в обрабатываемый файл:
f=fopen(argv[1],"wb");f2=fopen("t.bmp","rb");
while(fread(&c,1,1,f2)==1)fwrite(&c,1,1,f);
fclose(f);fclose(f2);
//--
return 0;
}