Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.98 KB | None | 0 0
  1. // Dolaczamy plik naglowkowy naszej klasy MyWindow
  2. #include "mywindow.h"
  3.  
  4. // Dolaczamy plik naglowkowy zawierajacy definicje GUI
  5. // Plik ten jest generowany automatycznie
  6. // z pliku XML "mywindow.ui"
  7. #include "ui_mywindow.h"
  8. #include "QPicture"
  9. // Definicja konstruktora, wywolujemy najpierw
  10. // konstruktor klasy nadrzednej, nastepnie tworzymy
  11. // obiekt klasy Ui_MyWindow reprezentujacy GUI
  12. MyWindow::MyWindow(QWidget *parent) :
  13. QMainWindow(parent),
  14. ui(new Ui::MyWindow)
  15. {
  16. // Wywolujemy funkcje tworzaca elementy GUI
  17. // Jej definicja znajduje sie w pliku "ui_mywindow.h"
  18. ui->setupUi(this);
  19.  
  20. // Pobieramy wymiary i wspolrzedne lewego gornego naroznika ramki
  21. // i ustawiamy wartosci odpowiednich pol
  22. // Uwaga: ramke "rysujFrame" wykorzystujemy tylko do
  23. // wygodnego ustaiwenia tych wymiarow. Rysunek bedziemy wyswietlac
  24. // bezposrednio w glownym oknie aplikacji.
  25. szer = ui->rysujFrame->width();
  26. wys = ui->rysujFrame->height();
  27. poczX = ui->rysujFrame->x();
  28. poczY = ui->rysujFrame->y() + 16;
  29.  
  30. // Tworzymy obiekt klasy QImage, o odpowiedniej szerokosci
  31. // i wysokosci. Ustawiamy format bitmapy na 32 bitowe RGB
  32. // (0xffRRGGBB).
  33. //img = new QImage(szer,wys,QImage::Format_RGB32);
  34. pic[0] = new QImage(":/img1.jpg");
  35. pic[1] = new QImage(":/img2.jpeg");
  36. pic[2] = new QImage(":/img3.jpg");
  37. pic[3] = new QImage(":/img2.jpg");
  38. pic[4] = new QImage(":/img5.jpg");
  39. //img = new QImage(":/img1.jpg");
  40. img = new QImage(szer,wys,QImage::Format_RGB32);
  41. *img = img->scaled(640,360,Qt::KeepAspectRatio);
  42. unsigned char *ptr;
  43. ptr = img->bits();
  44. int szer = img->width();
  45. int wys = img->height();
  46. update();
  47. int i,j;
  48. for(i = 0; i < 5 ;i ++){
  49. oppacity[i] = 0.0;
  50. mode[i] = 0;
  51. on[i] = false;
  52. }
  53.  
  54. for(i=0;i<wys;i++)
  55. {
  56. for(j=0;j<szer ;j++)
  57. {
  58. ptr[szer*4*i + 4*j]=255;
  59. ptr[szer*4*i + 4*j + 1] = 255;
  60. ptr[szer*4*i + 4*j + 2] = 255;
  61. }
  62. }
  63.  
  64.  
  65.  
  66. }
  67.  
  68. // Definicja destruktora
  69. MyWindow::~MyWindow()
  70. {
  71. delete ui;
  72. }
  73.  
  74. // Funkcja (slot) wywolywana po nacisnieciu przycisku "Wyjscie" (exitButton)
  75. // Uwaga: polaczenie tej funkcji z sygnalem "clicked"
  76. // emitowanym przez przycisk jest realizowane
  77. // za pomoca funkcji QMetaObject::connectSlotsByName(MyWindow)
  78. // znajdujacej sie w automatycznie generowanym pliku "ui_mywindow.h"
  79. // Nie musimy wiec sami wywolywac funkcji "connect"
  80. void MyWindow::on_exitButton_clicked()
  81. {
  82. // qApp to globalny wskaznik do obiektu reprezentujacego aplikacje
  83. // quit() to funkcja (slot) powodujaca zakonczenie aplikacji z kodem 0 (brak bledu)
  84. qApp->quit();
  85. }
  86.  
  87. QImage MyWindow::MultiplyMode(QImage *q1, QImage *q2){
  88. unsigned char *back;
  89. unsigned char *first;
  90. back = q1->bits();
  91. first = q2 -> bits();
  92. for(int i=0;i<wys;i++)
  93. {
  94. for(int j=0;j<szer ;j++)
  95. {
  96.  
  97. back[szer*4*i + 4*j]=(back[szer*4*i + 4*j] * first[szer*4*i + 4*j]) >> 8;
  98. back[szer*4*i + 4*j + 1] = (back[szer*4*i + 4*j + 1] * first[szer*4*i + 4*j + 1]) >> 8;
  99. back[szer*4*i + 4*j + 2] = (back[szer*4*i + 4*j + 2] * first[szer*4*i + 4*j + 2]) >> 8;
  100. }
  101. }
  102. temp = q1;
  103. return *temp;
  104. }
  105. QImage MyWindow::ScreenMode(QImage *q1, QImage *q2){
  106. unsigned char *back;
  107. unsigned char *first;
  108. back = q1->bits();
  109. first = q2 -> bits();
  110. for(int i=0;i<wys;i++)
  111. {
  112. for(int j=0;j<szer ;j++)
  113. {
  114. back[szer*4*i + 4*j]=255 - ((255 - (back[szer*4*i + 4*j])) * ((255 - first[szer*4*i + 4*j])) >> 8);
  115. back[szer*4*i + 4*j + 1] = 255 - ((255 - (back[szer*4*i + 4*j + 1])) * ((255 - first[szer*4*i + 4*j + 1])) >> 8);
  116. back[szer*4*i + 4*j + 2] = 255 - ((255 - (back[szer*4*i + 4*j + 2])) * ((255 - first[szer*4*i + 4*j + 2])) >> 8);
  117. }
  118. }
  119. temp = q1;
  120. return *temp;
  121. }
  122. QImage MyWindow::OverlayMode(QImage *q1, QImage *q2){
  123. unsigned char *back;
  124. unsigned char *first;
  125. back = q1->bits();
  126. first = q2 -> bits();
  127. for(int i=0;i<wys;i++)
  128. {
  129. for(int j=0;j<szer ;j++)
  130. {
  131. if(back[szer*4*i + 4*j] < 128){
  132. back[szer*4*i + 4*j]=(back[szer*4*i + 4*j] * first[szer*4*i + 4*j] )>> 7;
  133. }
  134. else{
  135. back[szer*4*i + 4*j]=255 - ((255 - back[szer*4*i + 4*j] * (255 - first[szer*4*i + 4*j]))>>7);
  136. }
  137. if(back[szer*4*i + 4*j + 1] < 128){
  138. back[szer*4*i + 4*j + 1]=(back[szer*4*i + 4*j + 1] * first[szer*4*i + 4*j + 1] )>> 7;
  139. }
  140. else{
  141. back[szer*4*i + 4*j + 1]=255 - ((255 - back[szer*4*i + 4*j + 1] * (255 - first[szer*4*i + 4*j + 1]))>>7);
  142. }
  143. if(back[szer*4*i + 4*j + 2] < 128){
  144. back[szer*4*i + 4*j + 2]=(back[szer*4*i + 4*j + 2] * first[szer*4*i + 4*j + 2] )>> 7;
  145. }
  146. else{
  147. back[szer*4*i + 4*j + 2]=255 - ((255 - back[szer*4*i + 4*j + 2] * (255 - first[szer*4*i + 4*j + 2]))>>7);
  148. }
  149.  
  150. }
  151. }
  152. temp = q1;
  153. return *temp;
  154. }
  155. QImage MyWindow::DarkenMode(QImage *q1, QImage *q2){
  156. unsigned char *back;
  157. unsigned char *first;
  158. back = q1->bits();
  159. first = q2 -> bits();
  160. for(int i=0;i<wys;i++)
  161. {
  162. for(int j=0;j<szer ;j++)
  163. {
  164. if(back[szer*4*i + 4*j] < first[szer*4*i + 4*j]){
  165. back[szer*4*i + 4*j] = back[szer*4*i + 4*j];
  166. }
  167. else{
  168. back[szer*4*i + 4*j] = first[szer*4*i + 4*j];
  169. }
  170. if(back[szer*4*i + 4*j + 1] < first[szer*4*i + 4*j + 1]){
  171. back[szer*4*i + 4*j + 1] = back[szer*4*i + 4*j + 1];
  172. }
  173. else{
  174. back[szer*4*i + 4*j + 1 ] = first[szer*4*i + 4*j + 1];
  175. }
  176. if(back[szer*4*i + 4*j + 2] < first[szer*4*i + 4*j + 2]){
  177. back[szer*4*i + 4*j + 2] = back[szer*4*i + 4*j + 2];
  178. }
  179. else{
  180. back[szer*4*i + 4*j + 2] = first[szer*4*i + 4*j + 2];
  181. }
  182. }
  183. }
  184. temp = q1;
  185. return *temp;
  186. }
  187. QImage MyWindow::LightenMode(QImage *q1, QImage *q2){
  188. unsigned char *back;
  189. unsigned char *first;
  190. back = q1->bits();
  191. first = q2 -> bits();
  192. for(int i=0;i<wys;i++)
  193. {
  194. for(int j=0;j<szer ;j++)
  195. {
  196. if(back[szer*4*i + 4*j] > first[szer*4*i + 4*j]){
  197. back[szer*4*i + 4*j] = back[szer*4*i + 4*j];
  198. }
  199. else{
  200. back[szer*4*i + 4*j] = first[szer*4*i + 4*j];
  201. }
  202. if(back[szer*4*i + 4*j + 1] > first[szer*4*i + 4*j + 1]){
  203. back[szer*4*i + 4*j + 1] = back[szer*4*i + 4*j + 1];
  204. }
  205. else{
  206. back[szer*4*i + 4*j + 1 ] = first[szer*4*i + 4*j + 1];
  207. }
  208. if(back[szer*4*i + 4*j + 2] > first[szer*4*i + 4*j + 2]){
  209. back[szer*4*i + 4*j + 2] = back[szer*4*i + 4*j + 2];
  210. }
  211. else{
  212. back[szer*4*i + 4*j + 2] = first[szer*4*i + 4*j + 2];
  213. }
  214. }
  215. }
  216. temp = q1;
  217. return *temp;
  218. }
  219. QImage MyWindow::DifferenceMode(QImage *q1, QImage *q2){
  220. unsigned char *back;
  221. unsigned char *first;
  222. back = q1->bits();
  223. first = q2 -> bits();
  224. for(int i=0;i<wys;i++)
  225. {
  226. for(int j=0;j<szer ;j++)
  227. {
  228. back[szer*4*i + 4*j]=abs(back[szer*4*i + 4*j] - first[szer*4*i + 4*j]);
  229. back[szer*4*i + 4*j + 1] = abs(back[szer*4*i + 4*j + 1] - first[szer*4*i + 4*j + 1]);
  230. back[szer*4*i + 4*j + 2] = abs(back[szer*4*i + 4*j + 2] - first[szer*4*i + 4*j + 2]);
  231. }
  232. }
  233. temp = q1;
  234. return *temp;
  235. }
  236. // Funkcja "odmalowujaca" komponent
  237. void MyWindow::paintEvent(QPaintEvent*)
  238. {
  239. // Obiekt klasy QPainter pozwala nam rysowac na komponentach
  240. QPainter p(this);
  241. // Rysuje obrazek "img" w punkcie (poczX,poczY)
  242. // (tu bedzie lewy gorny naroznik)
  243. p.drawImage(poczX,poczY, *img);
  244.  
  245. }
  246.  
  247.  
  248. // Funkcja (slot) wywolywana po nacisnieciu przycisku "Czysc" (cleanButton)
  249. void MyWindow::on_cleanButton_clicked()
  250. {
  251. // Funkcja czysci (zamalowuje na bialo) obszar rysowania
  252. // definicja znajduje sie ponizej
  253. czysc();
  254.  
  255. // Funkcja "update()" powoduje ponowne "namalowanie" calego komponentu
  256. // Wywoluje funkcje "paintEvent"
  257. update();
  258. }
  259.  
  260.  
  261. // Funkcja (slot) wywolywana po nacisnieciu przycisku "Rysuj 1" (draw1Button)
  262.  
  263.  
  264. void MyWindow::czysc()
  265. {
  266. // Wskaznik za pomoca, ktorego bedziemy modyfikowac obraz
  267. unsigned char *ptr;
  268.  
  269. // Funkcja "bits()" zwraca wskaznik do pierwszego piksela danych
  270. ptr = img->bits();
  271.  
  272. int i,j;
  273.  
  274. // Przechodzimy po wszystkich wierszach obrazu
  275. for(i=0; i<wys; i++)
  276. {
  277. // Przechodzimy po pikselach danego wiersza
  278. // W kazdym wierszu jest "szer" pikseli (tzn. 4 * "szer" bajtow)
  279. for(j=0; j<szer; j++)
  280. {
  281. ptr[szer*4*i + 4*j]=255; // Skladowa BLUE
  282. ptr[szer*4*i + 4*j + 1] = 255; // Skladowa GREEN
  283. ptr[szer*4*i + 4*j + 2] = 255; // Skladowa RED
  284. }
  285. }
  286. }
  287.  
  288.  
  289. // Funkcja powoduje zamalowanie obszaru rysowania pewnym wzorem
  290.  
  291.  
  292. // Funkcja (slot) wywolywana po nacisnieciu przycisku myszy (w glownym oknie)
  293. void MyWindow::mousePressEvent(QMouseEvent *event)
  294. {
  295. // Pobieramy wspolrzedne punktu klikniecia
  296. int x= event->x();
  297. int y = event->y();
  298.  
  299. // Sa to wspolrzedne wzgledem glownego okna,
  300. // Musimy odjac od nich wpolrzedne lewego gornego naroznika rysunku
  301.  
  302. x -= poczX;
  303. y -= poczY;
  304.  
  305. int kolor = 0;
  306. unsigned char *ptr;
  307. ptr = img->bits();
  308.  
  309. // Sprawdzamy ktory przycisk myszy zostal klkniety
  310. if(event->button() == Qt::LeftButton)
  311. {
  312. // jezeli lewy to ustawiamy kolor na czarny
  313. kolor = 255;
  314.  
  315. }
  316. else
  317. {
  318. // jezeli prawy to ustawiamy kolor na bialy
  319. kolor = 255;
  320. }
  321.  
  322. // Sprawdzamy czy klikniecie nastapilo w granicach rysunku
  323. /*
  324. if ((x>=0)&&(y>=0)&&(x<szer)&&(y<wys))
  325. {
  326.  
  327. // Ustawiamy kolor kliknietego piksela na bialy lub czarny
  328. ptr[szer*4*y + 4*x] = 255;
  329. ptr[szer*4*y + 4*x + 1] = 255;
  330. ptr[szer*4*y + 4*x + 2] = 255;
  331. }
  332.  
  333. */ // Ustawiamy kolor kliknietego piksela na bialy lub czarny
  334.  
  335.  
  336. // Odswiezamy komponent
  337. update();
  338.  
  339. }
  340.  
  341.  
  342. void MyWindow::on_checkBox_stateChanged(int arg1)
  343. {
  344. if(arg1 == 2){
  345. on[0] = true;
  346. run();
  347. }
  348. else{
  349. on[0] = false;
  350. run();
  351. }
  352.  
  353. }
  354. bool MyWindow::sprawdz(bool tab[]){
  355. for(int i = 0 ; i < 5 ; i++){
  356. if(tab[i] == true)
  357. return false;
  358. }
  359. return true;
  360. }
  361. void MyWindow::on_checkBox_2_stateChanged(int arg1)
  362. {
  363. if(arg1 == 2){
  364. on[1] = true;
  365. run();
  366. }
  367. else{
  368. on[1] = false;
  369. run();
  370. }
  371. }
  372.  
  373. void MyWindow::on_checkBox_3_stateChanged(int arg1)
  374. {
  375. if(arg1 == 2){
  376. on[2] = true;
  377. run();
  378. }
  379. else{
  380. on[2] = false;
  381. run();
  382. }
  383. }
  384.  
  385. void MyWindow::on_checkBox_4_stateChanged(int arg1)
  386. {
  387. if(arg1 == 2){
  388. on[3] = true;
  389. run();
  390. }
  391. else{
  392. on[3] = false;
  393. run();
  394. }
  395. }
  396.  
  397. void MyWindow::on_checkBox_5_stateChanged(int arg1)
  398. {
  399. if(arg1 == 2){
  400. on[4] = true;
  401. run();
  402. }
  403. else{
  404. on[4] = false;
  405. run();
  406. }
  407. }
  408. void MyWindow::run(){
  409. int n = 0;
  410. for(int i = 4 ; i >= 0 ; i--){
  411. if(on[i] == true){
  412. n++;
  413. if(mode[i] == 0){
  414. unsigned char* a = img->bits();
  415. QImage *picture = pic[i];
  416.  
  417. *picture = picture->scaled(640,360,Qt::KeepAspectRatio);
  418. unsigned char* b = picture->bits();
  419. for(int x=0;x<wys;x++)
  420. {
  421. for(int y=0;y<szer ;y++)
  422. {
  423. a[szer*4*x + 4*y] = oppacity[i] * b[szer*4*x + 4*y] + (1 - oppacity[i]) * a[szer*4*x + 4*y];
  424. a[szer*4*x + 4*y + 1] = oppacity[i] * b[szer*4*x + 4*y + 1] + (1 - oppacity[i]) * a[szer*4*x + 4*y + 1];
  425. a[szer*4*x + 4*y + 2] = oppacity[i] * b[szer*4*x + 4*y + 2] + (1 - oppacity[i]) * a[szer*4*x + 4*y + 2];
  426.  
  427.  
  428. }
  429. }
  430.  
  431. }
  432. if(mode[i] == 1){
  433. unsigned char* a = img->bits();
  434. QImage tmp = MultiplyMode(img,pic[i]);
  435. unsigned char* b = tmp.bits();
  436. for(int x=0;x<wys;x++)
  437. {
  438. for(int y=0;y<szer ;y++)
  439. {
  440. a[szer*4*x + 4*y] = oppacity[i] * b[szer*4*x + 4*y] + (1 - oppacity[i]) * a[szer*4*x + 4*y];
  441. a[szer*4*x + 4*y + 1] = oppacity[i] * b[szer*4*x + 4*y + 1] + (1 - oppacity[i]) * a[szer*4*x + 4*y + 1];
  442. a[szer*4*x + 4*y + 2] = oppacity[i] * b[szer*4*x + 4*y + 2] + (1 - oppacity[i]) * a[szer*4*x + 4*y + 2];
  443. }
  444. }
  445. }
  446. if(mode[i] == 2){
  447. unsigned char* a = img->bits();
  448. QImage tmp = ScreenMode(img,pic[i]);
  449. unsigned char* b = tmp.bits();
  450. for(int x=0;x<wys;x++)
  451. {
  452. for(int y=0;y<szer ;y++)
  453. {
  454. a[szer*4*x + 4*y] = oppacity[i] * b[szer*4*x + 4*y] + (1 - oppacity[i]) * a[szer*4*x + 4*y];
  455. a[szer*4*x + 4*y + 1] = oppacity[i] * b[szer*4*x + 4*y + 1] + (1 - oppacity[i]) * a[szer*4*x + 4*y + 1];
  456. a[szer*4*x + 4*y + 2] = oppacity[i] * b[szer*4*x + 4*y + 2] + (1 - oppacity[i]) * a[szer*4*x + 4*y + 2];
  457. }
  458. }
  459. }
  460. if(mode[i] == 3){
  461. unsigned char* a = img->bits();
  462. QImage tmp = DarkenMode(img,pic[i]);
  463. unsigned char* b = tmp.bits();
  464. for(int x=0;x<wys;x++)
  465. {
  466. for(int y=0;y<szer ;y++)
  467. {
  468. a[szer*4*x + 4*y] = oppacity[i] * b[szer*4*x + 4*y] + (1 - oppacity[i]) * a[szer*4*x + 4*y];
  469. a[szer*4*x + 4*y + 1] = oppacity[i] * b[szer*4*x + 4*y + 1] + (1 - oppacity[i]) * a[szer*4*x + 4*y + 1];
  470. a[szer*4*x + 4*y + 2] = oppacity[i] * b[szer*4*x + 4*y + 2] + (1 - oppacity[i]) * a[szer*4*x + 4*y + 2];
  471. }
  472. }
  473. }
  474. if(mode[i] == 4){
  475. unsigned char* a = img->bits();
  476. QImage tmp = LightenMode(img,pic[i]);
  477. unsigned char* b = tmp.bits();
  478. for(int x=0;x<wys;x++)
  479. {
  480. for(int y=0;y<szer ;y++)
  481. {
  482. a[szer*4*x + 4*y] = oppacity[i] * b[szer*4*x + 4*y] + (1 - oppacity[i]) * a[szer*4*x + 4*y];
  483. a[szer*4*x + 4*y + 1] = oppacity[i] * b[szer*4*x + 4*y + 1] + (1 - oppacity[i]) * a[szer*4*x + 4*y + 1];
  484. a[szer*4*x + 4*y + 2] = oppacity[i] * b[szer*4*x + 4*y + 2] + (1 - oppacity[i]) * a[szer*4*x + 4*y + 2];
  485. }
  486. }
  487. }
  488. if(mode[i] == 5){
  489. unsigned char* a = img->bits();
  490. QImage tmp = DifferenceMode(img,pic[i]);
  491. unsigned char* b = tmp.bits();
  492. for(int x=0;x<wys;x++)
  493. {
  494. for(int y=0;y<szer ;y++)
  495. {
  496. a[szer*4*x + 4*y] = oppacity[i] * b[szer*4*x + 4*y] + (1 - oppacity[i]) * a[szer*4*x + 4*y];
  497. a[szer*4*x + 4*y + 1] = oppacity[i] * b[szer*4*x + 4*y + 1] + (1 - oppacity[i]) * a[szer*4*x + 4*y + 1];
  498. a[szer*4*x + 4*y + 2] = oppacity[i] * b[szer*4*x + 4*y + 2] + (1 - oppacity[i]) * a[szer*4*x + 4*y + 2];
  499. }
  500. }
  501. }
  502. }
  503. update();
  504. }
  505. if(n == 0){
  506. unsigned char* a = img->bits();
  507. for(int x=0;x<wys;x++)
  508. {
  509. for(int y=0;y<szer ;y++)
  510. {
  511. a[szer*4*x + 4*y] = 255;
  512. a[szer*4*x + 4*y + 1] = 255;
  513. a[szer*4*x + 4*y + 2] = 255;
  514. }
  515. }
  516. update();
  517. }
  518. }
  519. void MyWindow::on_horizontalSlider_sliderMoved(int position)
  520. {
  521. oppacity[0] = (double) position / 100;
  522. run();
  523. }
  524. void MyWindow::on_horizontalSlider_2_sliderMoved(int position)
  525. {
  526. oppacity[1] = (double) position / 100;
  527. run();
  528. }
  529.  
  530. void MyWindow::on_horizontalSlider_3_sliderMoved(int position)
  531. {
  532. oppacity[2] = (double) position / 100;
  533. run();
  534. }
  535.  
  536. void MyWindow::on_horizontalSlider_4_sliderMoved(int position)
  537. {
  538. oppacity[3] = (double) position / 100;
  539. run();
  540. }
  541.  
  542.  
  543. void MyWindow::on_horizontalSlider_5_sliderMoved(int position)
  544. {
  545. oppacity[4] = (double) position / 100;
  546. run();
  547. }
  548.  
  549. void MyWindow::on_comboBox_activated(int index)
  550. {
  551. mode[0] = index;
  552. run();
  553. }
  554.  
  555. void MyWindow::on_comboBox_2_activated(int index)
  556. {
  557. mode[1] = index;
  558. run();
  559. }
  560.  
  561. void MyWindow::on_comboBox_3_activated(int index)
  562. {
  563. mode[2] = index;
  564. run();
  565. }
  566.  
  567. void MyWindow::on_comboBox_4_activated(int index)
  568. {
  569. mode[3] = index;
  570. run();
  571. }
  572.  
  573. void MyWindow::on_comboBox_5_activated(int index)
  574. {
  575. mode[4] = index;
  576. run();
  577. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement