Nadesłany przez Adrian Wijas, 26 listopada 2011 12:57
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
skala_szarosci_1_c.c:
/* Zamiana plików bmp do skali szarosci */
/* www.algorytm.org */
#include <stdio.h>
/* File Header */
typedef struct BMPFILEHEADER {
short type;
int fileSize;
short reserved0;
short reserved1;
int dataOffset;
} BMPFILEHEADER;
/* Info Header */
typedef struct BMPINFOHEADER {
int hdrSize;
int width;
int height;
short planes;
short depth;
int compression;
int bmpDataSize;
int hResolution;
int vResolution;
int nColors;
int nImportantColors;
} BMPINFOHEADER;
typedef struct RGB {
unsigned char R;
unsigned char G;
unsigned char B;
} Pixel24;
int main(int argc, char *argv[], char *envp[])
{
FILE *plik, *plik2;
BMPFILEHEADER FileInfo;
BMPINFOHEADER PictureInfo;
int i, j;
char szary;
short padding;
//char** grayPicture;
Pixel24** pixmap;
if(plik = fopen("lena2.bmp","rb"))
{
//wczytanie nagłówków BMP
fread(&FileInfo.type,2,1,plik);
fread(&FileInfo.fileSize,4,1,plik);
fread(&FileInfo.reserved0,2,1,plik);
fread(&FileInfo.reserved1,2,1,plik);
fread(&FileInfo.dataOffset,4,1,plik);
fread(&PictureInfo.hdrSize,4,1,plik);
fread(&PictureInfo.width,4,1,plik);
fread(&PictureInfo.height,4,1,plik);
fread(&PictureInfo.planes,2,1,plik);
fread(&PictureInfo.depth,2,1,plik);
fread(&PictureInfo.compression,4,1,plik);
fread(&PictureInfo.bmpDataSize,4,1,plik);
fread(&PictureInfo.hResolution,4,1,plik);
fread(&PictureInfo.vResolution,4,1,plik);
fread(&PictureInfo.nColors,4,1,plik);
fread(&PictureInfo.nImportantColors,4,1,plik);
//alokacja pamięci pod pixmape
pixmap = malloc(sizeof(Pixel24*) * PictureInfo.height);
for(i = 0; i < PictureInfo.height; i++)
pixmap[i] = (Pixel24**)malloc(sizeof(Pixel24) * PictureInfo.width);
//obliczenie wyrównania wiersza do wielokrotności 4B
padding = (PictureInfo.width*3)%4 ?
4-(PictureInfo.width*3)%4
:
0;
//wczytanie bitmapy do pix mapy :P
fseek(plik, FileInfo.dataOffset,SEEK_SET);
for(i = 0; i < PictureInfo.height; i++, fseek(plik, padding, SEEK_CUR))
for(j = 0; j < PictureInfo.width; j++)
{
pixmap[i][j].B = fgetc(plik);
pixmap[i][j].G = fgetc(plik);
pixmap[i][j].R = fgetc(plik);
}
//operacje na nowym pliku
if(plik2 = fopen("nowy3.bmp","wb"))
{ //kopiowanie pliku
fseek(plik, 0, SEEK_END);
j = ftell(plik);
fseek(plik, 0, SEEK_SET);
for(i = 0; i < j; i++)
fputc(fgetc(plik), plik2);
//zapis bitmapy + konwersja do szarości
fseek(plik2, FileInfo.dataOffset, SEEK_SET);
for(i = 0; i < PictureInfo.height; i++, fseek(plik2, padding, SEEK_CUR))
for(j = 0; j < PictureInfo.width; j++)
{
szary = (char)(0.229*pixmap[i][j].R + 0.587*pixmap[i][j].G + 0.114*pixmap[i][j].B);
fputc(szary, plik2);
fputc(szary, plik2);
fputc(szary, plik2);
}
fclose(plik2);
}
else printf("niepowodzenie tworzenia pliku");
//zwolnienie pamięci pixmapy
for(i = 0; i<PictureInfo.height; i++)
free(pixmap[i]);
free(pixmap);
//zamkniecie plików
fclose(plik);
}
else printf("blad odczytu pliku");
system("pause");
return 0;
}

