Guest User

Untitled

a guest
Apr 21st, 2018
58
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 8.24 KB | None | 0 0
  1. /************************************************************
  2.  * -- NIE USUWAJ TEJ INFORMACJI Z PROGRAMU ---------------- *
  3.  ************************************************************
  4.  * -- Program powstał na bazie kodu źródłowego ------------ *
  5.  * -- udostępnionego studentom na potrzeby przedmiotu ----- *
  6.  * -- Programowanie Interfejsu Użytkownika ---------------- *
  7.  * -- Copyright (c) 2010 Politechnika Śląska w Gliwicach -- *
  8.  * -- Radosław Sokół, Wydział Elektryczny ----------------- *
  9.  ************************************************************/
  10.  
  11. #include <assert.h>
  12. #include <windows.h>
  13. #include <stdio.h>
  14. #include <exception>
  15.  
  16. TCHAR NazwaAplikacji[] = TEXT("Przetwarzanie obrazu");
  17. TCHAR NazwaKlasy[] = TEXT("OKNOGLOWNE");
  18.  
  19. char *Rysunek = 0;
  20. char *Filtrowany = 0;
  21. DWORD RozmiarRysunku = 0;
  22. unsigned char NrFiltru = 0;
  23. double CzasFiltrowania = 0.0;
  24. unsigned char Prog = 100;
  25. HWND APP;
  26.  
  27. struct RGB { unsigned char B, G, R; };
  28.  
  29. inline unsigned int RoundUp4(const unsigned int i)
  30. {
  31.     return (i+3)&(~3);
  32. }
  33.  
  34. static void AplikujFiltr()
  35. {
  36.     assert(sizeof(RGB) == 3);
  37.     BITMAPFILEHEADER *bfh = reinterpret_cast<BITMAPFILEHEADER*>(Filtrowany);
  38.     BITMAPINFO *bi = reinterpret_cast<BITMAPINFO*>(Filtrowany + sizeof(BITMAPFILEHEADER));
  39.     if ((bi->bmiHeader.biBitCount != 24) && (bi->bmiHeader.biBitCount != 32)) throw std::exception();
  40.     RGB *Raster = reinterpret_cast<RGB*>(Filtrowany + bfh->bfOffBits);
  41.     RGB *Punkt;
  42.     register int Wiersz, Kolumna;
  43.     switch (NrFiltru) {
  44.         case 1: //wywalanie kanału R
  45.             for (Wiersz = 0; Wiersz < bi->bmiHeader.biHeight; ++Wiersz) {
  46.                 Punkt = Raster + RoundUp4(Wiersz * bi->bmiHeader.biWidth * sizeof(RGB)) / sizeof(RGB);
  47.                 for (Kolumna = 0; Kolumna < bi->bmiHeader.biWidth; ++Kolumna) {
  48.                     Punkt->R = 0;
  49.                     ++Punkt;
  50.                 }
  51.             }
  52.             NrFiltru = 0;
  53.             break;
  54.         case 2: //skala szarości
  55.             for (Wiersz = 0; Wiersz < bi->bmiHeader.biHeight; ++Wiersz) {
  56.                 Punkt = Raster + RoundUp4(Wiersz * bi->bmiHeader.biWidth * sizeof(RGB)) / sizeof(RGB);
  57.                 for (Kolumna = 0; Kolumna < bi->bmiHeader.biWidth; ++Kolumna) {
  58.                     Punkt->R = Punkt->G = Punkt->B =(Punkt->R + Punkt->G + Punkt->B) / 3;
  59.                     ++Punkt;
  60.                 }
  61.             }
  62.             NrFiltru = 0;
  63.             break;
  64.         case 3: //progowanie
  65.             for (Wiersz = 0; Wiersz < bi->bmiHeader.biHeight; ++Wiersz) {
  66.                 Punkt = Raster + RoundUp4(Wiersz * bi->bmiHeader.biWidth * sizeof(RGB)) / sizeof(RGB);
  67.                 for (Kolumna = 0; Kolumna < bi->bmiHeader.biWidth; ++Kolumna) {
  68.                     short int X = (Punkt->R + Punkt->G + Punkt->B) / 3;
  69.                     if( X < Prog )
  70.                         Punkt->R = Punkt->G = Punkt->B = 0;
  71.                     else
  72.                         Punkt->R = Punkt->G = Punkt->B = 255;
  73.                     ++Punkt;
  74.                 }
  75.             }
  76.             NrFiltru = 0;
  77.             break;
  78.         case 4: //rozmywanie
  79.             for (Wiersz = 1; Wiersz < bi->bmiHeader.biHeight - 1; ++Wiersz) {
  80.                 Punkt = Raster + RoundUp4(Wiersz * bi->bmiHeader.biWidth * sizeof(RGB)) / sizeof(RGB);
  81.                 for (Kolumna = 1; Kolumna < bi->bmiHeader.biWidth - 1; ++Kolumna) {
  82.                     RGB *Pixel[9];
  83.  
  84.                     Pixel[0] = Raster + RoundUp4((Wiersz - 1) * bi->bmiHeader.biWidth * sizeof(RGB)) / sizeof(RGB);
  85.                     Pixel[0] += Kolumna - 2;
  86.                     Pixel[1] = Pixel[0] + 1;
  87.                     Pixel[2] = Pixel[1] + 2;
  88.  
  89.                     Pixel[3] = Raster + RoundUp4(Wiersz * bi->bmiHeader.biWidth * sizeof(RGB)) / sizeof(RGB);
  90.                     Pixel[3] += Kolumna - 2;
  91.                     Pixel[4] = Pixel[3] + 1;
  92.                     Pixel[5] = Pixel[4] + 2;
  93.  
  94.                     Pixel[6] = Raster + RoundUp4((Wiersz + 1) * bi->bmiHeader.biWidth * sizeof(RGB)) / sizeof(RGB);
  95.                     Pixel[6] += Kolumna - 2;
  96.                     Pixel[7] = Pixel[6] + 1;
  97.                     Pixel[8] = Pixel[7] + 2;
  98.  
  99.                     int _R = 0, _G = 0, _B = 0;
  100.                     for( char i = 0; i < 9; i++){
  101.                         _R += Pixel[i]->R;
  102.                         _G += Pixel[i]->G;
  103.                         _B += Pixel[i]->B;
  104.                     }
  105.                     _R /= 9;
  106.                     _G /= 9;
  107.                     _B /= 9;
  108.  
  109.                     Pixel[4]->R = _R;
  110.                     Pixel[4]->G = _G;
  111.                     Pixel[4]->B = _B;
  112.                 }
  113.             }
  114.             NrFiltru = 0;
  115.             break;
  116.         case 5:
  117.             Sleep(9);
  118.             break;
  119.         case 6:
  120.             Sleep(11);
  121.             break;
  122.     }
  123. }
  124.  
  125. static void KopiujFiltrowany()
  126. {
  127.     if (Filtrowany == 0) Filtrowany = new char [RozmiarRysunku];
  128.     memcpy(Filtrowany, Rysunek, RozmiarRysunku);
  129. }
  130.  
  131. static void Tworz(const HWND Okno)
  132. {
  133.     register const HANDLE Plik = CreateFile(TEXT("Obraz.bmp"), GENERIC_READ, FILE_SHARE_READ,
  134.         NULL, OPEN_EXISTING, 0, NULL);
  135.     if (Plik == INVALID_HANDLE_VALUE) {
  136.         MessageBox(Okno, TEXT("Błąd w trakcie otwierania pliku Obraz.bmp"),
  137.             NazwaAplikacji, MB_ICONEXCLAMATION | MB_OK);
  138.         return;
  139.     }
  140.     RozmiarRysunku = GetFileSize(Plik, NULL);
  141.     Rysunek = new char [RozmiarRysunku];
  142.     DWORD Odczytano;
  143.     ReadFile(Plik, Rysunek, RozmiarRysunku, &Odczytano, NULL);
  144.     CloseHandle(Plik);
  145.     KopiujFiltrowany();
  146. }
  147.  
  148. static void Rysuj(const HWND Okno)
  149. {
  150.     RECT Rozmiar;
  151.     TCHAR Tekst[64];
  152.     PAINTSTRUCT PS;
  153.     unsigned int dl;
  154.     GetClientRect(Okno, &Rozmiar);
  155.     const HDC DC = BeginPaint(Okno, &PS);
  156.     if (Rysunek != 0) {
  157.         BITMAPFILEHEADER *bfh = reinterpret_cast<BITMAPFILEHEADER*>(Filtrowany);
  158.         BITMAPINFO *bi = reinterpret_cast<BITMAPINFO*>(Filtrowany + sizeof(BITMAPFILEHEADER));
  159.         SetStretchBltMode(DC, HALFTONE);
  160.         StretchDIBits(DC, 0, 0, Rozmiar.right, Rozmiar.bottom, 0, 0, bi->bmiHeader.biWidth, bi->bmiHeader.biHeight,
  161.             static_cast<void*>(Filtrowany + bfh->bfOffBits), bi, DIB_RGB_COLORS, SRCCOPY);
  162.         dl = swprintf(Tekst, TEXT("Czas filtrowania: %.2lf ms"), CzasFiltrowania);
  163.         TextOut(DC, 5, 5, Tekst, dl);
  164.     }
  165.     EndPaint(Okno, &PS);
  166. }
  167.  
  168. static void Znak(const HWND Okno, const TCHAR Znak)
  169. {
  170.     if (Znak >= TEXT('0') && Znak <= TEXT('9')) {
  171.         SYSTEMTIME S1, S2;
  172.         NrFiltru = Znak - TEXT('0');
  173.         SetWindowText(Okno, TEXT("TRWA FILTROWANIE..."));
  174.         KopiujFiltrowany();
  175.         GetSystemTime(&S1);
  176.         if (NrFiltru > 0 && NrFiltru <= 9)
  177.             for (unsigned int i = 0; i < 50; ++i) AplikujFiltr();
  178.         GetSystemTime(&S2);
  179.         CzasFiltrowania = 3600.0 * (S2.wHour - S1.wHour) + 60.0 * (S2.wMinute - S1.wMinute)
  180.             + (S2.wSecond - S1.wSecond) + 0.001 * (S2.wMilliseconds - S1.wMilliseconds);
  181.         CzasFiltrowania *= 2.0;
  182.         InvalidateRect(Okno, NULL, FALSE);
  183.         SetWindowText(Okno, NazwaAplikacji);
  184.         UpdateWindow(Okno);
  185.     }
  186. }
  187.  
  188. static LRESULT CALLBACK FunkcjaOkienkowa(HWND Okno, UINT Komunikat, WPARAM wParam, LPARAM lParam)
  189. {
  190.     switch (Komunikat) {
  191.         case WM_CREATE:
  192.             Tworz(Okno);
  193.             break;
  194.         case WM_CHAR:
  195.             Znak(Okno, static_cast<TCHAR>(wParam));
  196.             break;
  197.         case WM_PAINT:
  198.             Rysuj(Okno);
  199.             break;
  200.         case WM_DESTROY:
  201.             delete [] Rysunek;
  202.             delete [] Filtrowany;
  203.             PostQuitMessage(0);
  204.             break;
  205.         default:
  206.             return DefWindowProc(Okno, Komunikat, wParam, lParam);
  207.     }
  208.     return 0;
  209. }
  210.  
  211. static bool RejestrujKlasy()
  212. {
  213.     WNDCLASSEX wc;
  214.     wc.cbSize = sizeof(WNDCLASSEX);
  215.     wc.cbClsExtra = wc.cbWndExtra = 0;
  216.     wc.hbrBackground = (HBRUSH) (1 + COLOR_WINDOW);
  217.     wc.hCursor = LoadCursor(NULL, IDC_ARROW);
  218.     wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
  219.     wc.hIconSm = LoadIcon(NULL, IDI_APPLICATION);
  220.     wc.hInstance = GetModuleHandle(NULL);
  221.     wc.lpfnWndProc = &FunkcjaOkienkowa;
  222.     wc.lpszClassName = NazwaKlasy;
  223.     wc.lpszMenuName = NULL;
  224.     wc.style = CS_HREDRAW | CS_VREDRAW;
  225.     return (RegisterClassEx(&wc) != 0);
  226. }
  227.  
  228. static void WyrejestrujKlasy()
  229. {
  230.     UnregisterClass(NazwaKlasy, GetModuleHandle(NULL));
  231. }
  232.  
  233. int WINAPI WinMain(HINSTANCE Instancja, HINSTANCE Poprzednia, LPSTR Parametry, int Widocznosc)
  234. {
  235.     // Zarejestruj klasę. Protestuj, jeżeli wystąpił błąd.
  236.     if (!RejestrujKlasy()) {
  237.         MessageBox(NULL, TEXT("Nie udało się zarejestrować klasy okna!"),
  238.             NazwaAplikacji, MB_ICONSTOP | MB_OK);
  239.         return 1;
  240.     }
  241.     // Stwórz główne okno. Również protestuj, jeżeli wystąpił błąd.
  242.     HWND GlowneOkno = CreateWindowEx(WS_EX_APPWINDOW | WS_EX_CLIENTEDGE,
  243.         NazwaKlasy, NazwaAplikacji, WS_OVERLAPPEDWINDOW,
  244.         CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT,
  245.         NULL, NULL, Instancja, NULL);
  246.     if (GlowneOkno == NULL) {
  247.         MessageBox(NULL, TEXT("Nie udało się stworzyć głównego okna!"),
  248.             NazwaAplikacji, MB_ICONSTOP | MB_OK);
  249.         return 2;
  250.     }
  251.     APP = GlowneOkno;
  252.     // Wyświetl i uaktualnij nowo stworzone okno.
  253.     ShowWindow(GlowneOkno, Widocznosc);
  254.     UpdateWindow(GlowneOkno);
  255.     // Główna pętla komunikatów wątku.
  256.     MSG Komunikat;
  257.     while (GetMessage(&Komunikat, NULL, 0, 0) > 0) {
  258.         TranslateMessage(&Komunikat);
  259.         DispatchMessage(&Komunikat);
  260.     }
  261.     // Zwolnij pamięć klas i zakończ proces.
  262.     WyrejestrujKlasy();
  263.     return static_cast<int>(Komunikat.wParam);
  264. }
Add Comment
Please, Sign In to add comment