algorytm.org

Implementacja w C/C++



Baza Wiedzy
wersja offline serwisu przeznaczona na urządzenia z systemem Android
Darowizny
darowiznaWspomóż rozwój serwisu
Nagłówki RSS
Artykuły
Implementacje
Komentarze
Forum
Bookmarki






Sonda
Implementacji w jakim języku programowania poszukujesz?

Skala szarości - Implementacja w C/C++
Ocena użytkownikóww: *****  / 5
SłabyŚwietny
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;   
}

Komentarze
photo
0 # Kraver 2013-05-16 14:41
Brakuje bibloteki stdlib.h
Odpowiedz | Odpowiedz z cytatem | Cytować
Dodaj komentarz