Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream.h>
- #include <dos.h>
- #include <mem.h>
- #include <string.h>
- #include <conio.h>
- #include <stdio.h>
- #include <stdlib.h>
- #define VIDEOPRZERW 0x10 // Przerwanie BIOSu
- #define USTAWWIDEO 0x00 // Funkcja BIOS zeby ustawić tryb video
- #define TRYBVGA256 0x13 // ustawia tryb 256 kolorowy 320x200
- #define TRYBTEKST 0x03 // ustawia tryb tekstowy 80x25
- #define LICZBAKOLOROW 255 // liczba kolorow
- typedef unsigned char BYTE;
- typedef unsigned int WORD;
- typedef unsigned int UINT;
- typedef unsigned long DWORD;
- typedef unsigned long LONG;
- void wlaczTryb(BYTE mode) // funkcja do ustawiania trybu graficznego albo tekstowego
- {
- union REGS regs;
- regs.h.ah = USTAWWIDEO;
- regs.h.al = mode;
- int86(VIDEOPRZERW, ®s, ®s);
- }
- struct BITMAPFILEHEADER
- {
- UINT bfType; //Opis formatu pliku. Musi byc 'BM'.
- DWORD bfSize; //Rozmiar pliku BMP w bajtach.
- UINT bfReserved1; //Zarezerwowane. Musi byc rowne 0.
- UINT bfReserved2; //Zarezerwowane. Musi byc rowne 0.
- DWORD bfOffBits; //Przesuniecie w bajtach poczatku danych
- };
- struct BITMAPINFOHEADER
- {
- DWORD biSize; //Rozmiar struktury BITMAPINFOHEADER.
- LONG biWidth; //Szerokosc bitmapy w pikselach.
- LONG biHeight; //Wysokosc bitmapy w pikselach.
- WORD biPlanes; //Ilosc plaszczyzn. Musi byc 1.
- WORD biBitCount; //Glebia kolorow w bitach na piksel.
- DWORD biCompression; //Rodzaj kompresji (0 – brak).
- DWORD biSizeImage; //Rozmiar obrazu w bajtach. Uwaga moze byc 0.
- LONG biXPelsPerMeter; //Rozdzielczosc pozioma w pikselach na metr.
- LONG biYPelsPerMeter; //Rozdzielczosc pionowa w pikselach na metr.
- DWORD biClrUsed; //Ilosc uzywanych kolorow z palety.
- DWORD biClrImportant; //Ilosc kolorow z palety niezbednych do
- }; //wyswietlenia obrazu.
- struct RGBQUAD
- {
- BYTE rgbBlue;
- BYTE rgbGreen;
- BYTE rgbRed;
- BYTE rgbReserved;
- };
- unsigned char far* video_memory = (BYTE *)0xA0000000L;
- FILE *bitmap_file; //Plik bitmapy
- BITMAPFILEHEADER bmfh; //nagłówek nr 1 bitmapy
- BITMAPINFOHEADER bmih; //nagłówek nr 2 bitmapy
- RGBQUAD palette[256];
- void wyswietl(int gamma, int negatyw,BITMAPINFOHEADER bmih)
- {
- outportb(0x03C8, 0); //rozpocznij ustawianie palety od koloru nr 0
- for (int i = 0; i < LICZBAKOLOROW; i++) //ilosc kolorow w palecie 8-bitowej
- {
- if (palette[i].rgbRed + gamma > LICZBAKOLOROW)
- outp(0x03C9, 63);
- else if (palette[i].rgbRed + gamma < 0)
- outp(0x03C9, 0);
- else if (negatyw == 1)
- outp(0x03C9, ~palette[i].rgbRed * 63 / LICZBAKOLOROW);
- else
- outp(0x03C9, (palette[i].rgbRed + gamma) * 63 / LICZBAKOLOROW);
- if (palette[i].rgbGreen + gamma > LICZBAKOLOROW)
- outp(0x03C9, 63);
- else if (palette[i].rgbGreen + gamma < 0)
- outp(0x03C9, 0);
- else if (negatyw == 1)
- outp(0x03C9, ~palette[i].rgbGreen * 63 / LICZBAKOLOROW);
- else
- outp(0x03C9, (palette[i].rgbGreen + gamma) * 63 / LICZBAKOLOROW);
- if (palette[i].rgbBlue + gamma > LICZBAKOLOROW)
- outp(0x03C9, 63);
- else if (palette[i].rgbBlue + gamma < 0)
- outp(0x03C9, 0);
- else if (negatyw == 1)
- outp(0x03C9, ~palette[i].rgbBlue * 63 / LICZBAKOLOROW);
- else
- outp(0x03C9, (palette[i].rgbBlue + gamma) * 63 / LICZBAKOLOROW);
- }
- for(int m = 200;m>200-bmih.biHeight; m--)
- {
- int z=1;
- for(int i=320; i>320-bmih.biWidth; i--)
- {
- for(;z<=bmih.biWidth;z++)
- {
- BYTE l;
- fread(&l, sizeof(BYTE), 1, bitmap_file);
- video_memory[m*i-z] = l;
- }
- }
- }
- }
- int main()
- {
- char nazwaPliku[30];
- char wybranaOpcja, wyjscie = 'n';
- int dlugosc = 0;
- while (wyjscie != 'T' && wyjscie != 't')
- {
- while(1)
- {
- dlugosc = 0;
- wyjscie = 'n';
- cout << "W folderze znajduja sie nastepujace pliki w formacie .BMP: \n" << endl;
- system("dir *.BMP");
- cout << "\nPodaj nazwe pliku, ktory chcesz zmienic: \n";
- cin >> nazwaPliku;
- dlugosc = strlen(nazwaPliku);
- if ((nazwaPliku[dlugosc - 1] != 'P' && nazwaPliku[dlugosc - 2] != 'M' && nazwaPliku[dlugosc - 3] != 'B') && (nazwaPliku[dlugosc - 1] != 'p' && nazwaPliku[dlugosc - 2] != 'm' && nazwaPliku[dlugosc - 3] != 'b'))
- {
- strcat(nazwaPliku, ".BMP");
- }
- cin.sync();
- if (!(bitmap_file = fopen(nazwaPliku, "rb")))
- {
- cout << "\nBlad!!! Plik nie istnieje\n" << endl;
- cout << "------------------------------------------------------" << endl;
- }
- else break;
- }
- fread(&bmfh, sizeof(BITMAPFILEHEADER), 1, bitmap_file);
- fread(&bmih, sizeof(BITMAPINFOHEADER), 1, bitmap_file);
- fread(palette, sizeof(RGBQUAD), 256, bitmap_file);
- cout<< bmih.biWidth << ' ' << bmih.biHeight;
- cout << "Nacisnij dowolny klawisz, aby wyswietlic plik";
- getch();
- wlaczTryb(TRYBVGA256);
- wyswietl(0,0,bmih);
- getch();
- wlaczTryb(TRYBTEKST);
- fclose(bitmap_file);
- //otwórz plik do odczytu w trybie binarnym "rb"
- bitmap_file = fopen(nazwaPliku, "rb");
- //odczytaj z pliku nagłówek nr 1 i zapamiętaj w zmiennej bmfh
- fread(&bmfh, sizeof(BITMAPFILEHEADER), 1, bitmap_file);
- //odczytaj z pliku nagłówek nr 2 i zapamiętaj w zmiennej bmih
- fread(&bmih, sizeof(BITMAPINFOHEADER), 1, bitmap_file);
- fread(palette, sizeof(RGBQUAD), 256, bitmap_file);
- int a = 1;
- while(a)
- {
- cout << "Wybierz operacje graficzna:\n1. Negatyw\n2. Zmiana jasnosci\n";
- cin >> wybranaOpcja;
- switch (wybranaOpcja)
- {
- case '1':
- {
- cout << "Nacisnij dowolny klawisz, aby wyswietlic obraz";
- getch();
- wlaczTryb(TRYBVGA256);
- wyswietl(0,1,bmih);
- getch();
- a = 0;
- break;
- }
- case '2':
- {
- int gamma;
- cout << "Wybierz o ile chcesz zmienic jasnosc obrazu\n";
- cin >> gamma;
- cin.sync();
- cout << "Nacisnij dowolny klawisz, aby wyswietlic obraz";
- getch();
- wlaczTryb(TRYBVGA256);
- wyswietl(gamma,0,bmih);
- getch();
- a = 0;
- break;
- }
- default:
- {
- wlaczTryb(TRYBTEKST);
- cout << "Nie ma takiej opcji!";
- cin.clear();
- cin.sync();
- }
- }
- }
- fclose(bitmap_file);
- wlaczTryb(TRYBTEKST);
- cout << "Czy chcesz zakonczyc prace z programem? [T|n]" << endl;
- cin >> wyjscie;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement