Guest User

Untitled

a guest
Jan 12th, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.87 KB | None | 0 0
  1. #include <iostream> //cout
  2. #include <stdio.h> //fread(), fseek(), fwrite(), fopen(), fclose()
  3. #include <Windows.h> //Datentypen DWORD, WORD, long
  4. #include <conio.h> //getch()
  5.  
  6. using namespace std;
  7.  
  8. void main() {
  9. //####reddit_red.bmp####
  10.     long biWidth_reddit, biHeight_reddit; //Breite und Höhe
  11.     WORD biBitCount_reddit; //Farbtiefe
  12.     DWORD biOffBits_reddit; //OffBits
  13.     BYTE *farben_reddit; //Array für Farbwerte
  14.     int bg_reddit; //Bildgröße
  15.     int byteCount_reddit; //Anzahl der Bytes pro Reihe, wird errechnet aus Breite * 3 + 1
  16.    
  17. //####moon_empty.bmp####
  18.     long biWidth_moon, biHeight_moon; //Breite und Höhe
  19.     WORD biBitCount_moon; //Farbtiefe
  20.     DWORD biOffBits_moon; //OffBits
  21.     BYTE *header_moon; //Array für Header
  22.     BYTE *farben_moon; //Array für Farben
  23.     int bg_moon; //Bildgröße
  24.     int byteCount_moon; //Anzahl der Bytes pro Reihe, wird errechnet aus Breite * 3
  25.    
  26. //####Sonstiges####
  27.     int bpp; //Byte Per Pixel, wird errechnet aus Farbtiefe / 8
  28.     int i = 0, j = 0, k = 0, l = 0; //Laufvariablen
  29.     FILE *pF; //Datei
  30.  
  31. //####Einlesen aus reddit_red.bmp####
  32.     pF = fopen("reddit_red.bmp", "rb"); //Binär-lesend öffnen
  33.    
  34.     if(pF == NULL){
  35.         cout << "Datei konnte nicht geoeffnet werden";
  36.         getch();
  37.         exit(0);
  38.     }
  39.    
  40.     fseek(pF, 10, SEEK_SET);
  41.     fread(&biOffBits_reddit, sizeof(DWORD), 1, pF); //OffBits einlesen
  42.    
  43.     fseek(pF, 18, SEEK_SET);
  44.     fread(&biWidth_reddit, sizeof(long), 1, pF); //Breite einlesen
  45.     fread(&biHeight_reddit, sizeof(long), 1, pF); //Höhe einlesen
  46.    
  47.     fseek(pF, 28, SEEK_SET);
  48.     fread(&biBitCount_reddit, sizeof(WORD), 1, pF); //Farbtiefe einlesen
  49.    
  50.     bpp = biBitCount_reddit / 8; //Ausrechnen der Byte Per Pixel
  51.     bg_reddit = bpp*(biHeight_reddit+1)*(biWidth_reddit+1); //Ermitteln der Bildgröße; Abmessungen +1, da sonst zu klein.
  52.     byteCount_reddit = (biWidth_reddit+1)*bpp; //Ermittlung der Byteanzahl pro Reihe
  53.    
  54.     farben_reddit = (BYTE *)malloc(bg_reddit*sizeof(BYTE)); //Speicher für Farben anlegen
  55.    
  56.     fseek(pF, biOffBits_reddit, SEEK_SET);
  57.     fread(farben_reddit, sizeof(BYTE), bg_reddit, pF); //Einlesen der Farben aller Pixel
  58.    
  59.     fclose(pF);
  60.    
  61. //####Einlesen aus moon_empty.bmp####
  62.     pF = fopen("moon_empty.bmp", "rb"); //Binär-lesend öffnen
  63.    
  64.     if(pF == NULL){
  65.         cout << "Datei konnte nicht geoeffnet werden";
  66.         getch();
  67.         exit(0);
  68.     }
  69.    
  70.     fseek(pF, 10, SEEK_SET);
  71.     fread(&biOffBits_moon, sizeof(DWORD), 1, pF); //OffBits einlesen
  72.    
  73.     fseek(pF, 18, SEEK_SET);
  74.     fread(&biWidth_moon, sizeof(long), 1, pF); //Breite einlesen
  75.     fread(&biHeight_moon, sizeof(long), 1, pF); //Höhe einlesen
  76.    
  77.     fseek(pF, 28, SEEK_SET);
  78.     fread(&biBitCount_moon, sizeof(WORD), 1, pF); //Farbtiefe einlesen
  79.    
  80.     if(biBitCount_reddit != biBitCount_moon){ //Überprüfen, ob die Farbtiefen übereinstimmen
  81.         cout << "Farbtiefe stimmt nicht überein. Programm wird beendet.";
  82.         getch();
  83.         exit(0);
  84.     }
  85.    
  86.     header_moon = (BYTE *)malloc(biOffBits_moon*sizeof(BYTE)); //Speicher für Header anlegen
  87.    
  88.     fseek(pF, 0, SEEK_SET);
  89.     fread(header_moon, sizeof(BYTE),biOffBits_moon, pF); //Einlesen des Headers
  90.    
  91.     bg_moon = bpp*(biWidth_moon+1)*(biHeight_moon+1); //Ermitteln der Bildgröße; Abmessungen +1, da sonst zu klein.
  92.     byteCount_moon = biWidth_moon*bpp; //Ermittlung der Byteanzahl pro Reihe
  93.    
  94.     farben_moon = (BYTE *)malloc(bg_moon*sizeof(BYTE)); //Speicher für Farben anlegen
  95.    
  96.     fseek(pF, biOffBits_moon, SEEK_SET);
  97.     fread(farben_moon, sizeof(BYTE), bg_moon,pF); //Einlesen der Farben aller Pixel
  98.    
  99.     fclose(pF);
  100.        
  101. //####Routine zum Ersetzen der Bilddaten von moon_empty.bmp durch Bilddaten aus reddit_red.bmp; Filterung der roten Farbe
  102.     for (int i = 70;i < biHeight_reddit+70; i++){ //i=70 um die Höhe zu ändern
  103.         l = byteCount_moon*i+i+210; //Eine Breitenreihe * Höhe + i (um eine Einrückung um einen weiteren Pixel zu verhindern) + 210 (Einrückung von der Seite aus); Standpunkt in Bild moon_empty.bmp
  104.         for(int j = 0; j < byteCount_reddit-3; j += 3){ //Schleife um Farbwerte zu überprüfen und ggf. zu ersetzen
  105.             if(!(farben_reddit[k+j] == 0x00 && farben_reddit[k+j+1] == 0x00 && farben_reddit[k+j+2] == 0xFF)){  //Überprüfen ob Farbe Rot ist
  106.                 farben_moon[l+j] = farben_reddit[k+j]; //Standpunkt l + aktuelles zu veränderndes Byte + 210 (Einrückung) = Standpunkt k + aktuelles zu veränderndes Byte
  107.                 farben_moon[l+j+1] = farben_reddit[k+j+1]; //+1, da der nächste Byte verändert werden muss (Eine Farbe = Bytes)
  108.                 farben_moon[l+j+2] = farben_reddit[k+j+2];
  109.             }
  110.         }
  111.         k += byteCount_reddit;                                                                                  //Standpunkt reddit_red.bmp
  112.     }
  113.    
  114.     fopen("moon.bmp", "wb"); //Binär-schreibend öffnen
  115.    
  116.     if(pF == NULL){
  117.         cout << "Datei konnte nicht geoeffnet werden";
  118.         getch();
  119.         exit(0);
  120.     }
  121.    
  122.     fwrite(header_moon, sizeof(BYTE), biOffBits_moon, pF); //Schreiben des Headers in moon.bmp
  123.     fwrite(farben_moon, sizeof(BYTE), bg_moon, pF); //Schreiben der Bilddaten in moon.bmp
  124.    
  125.     fclose(pF);
  126.    
  127.     free(farben_reddit);
  128.     free(header_moon);
  129.     free(farben_moon);
  130. }
Add Comment
Please, Sign In to add comment