Advertisement
Guest User

Untitled

a guest
Apr 24th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.05 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.  
  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();
  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.  
  35. }
  36.  
  37. // Definicja destruktora
  38. MyWindow::~MyWindow()
  39. {
  40. delete ui;
  41. }
  42.  
  43. // Funkcja (slot) wywolywana po nacisnieciu przycisku "Wyjscie" (exitButton)
  44. // Uwaga: polaczenie tej funkcji z sygnalem "clicked"
  45. // emitowanym przez przycisk jest realizowane
  46. // za pomoca funkcji QMetaObject::connectSlotsByName(MyWindow)
  47. // znajdujacej sie w automatycznie generowanym pliku "ui_mywindow.h"
  48. // Nie musimy wiec sami wywolywac funkcji "connect"
  49. void MyWindow::on_exitButton_clicked()
  50. {
  51. // qApp to globalny wskaznik do obiektu reprezentujacego aplikacje
  52. // quit() to funkcja (slot) powodujaca zakonczenie aplikacji z kodem 0 (brak bledu)
  53. qApp->quit();
  54. }
  55.  
  56.  
  57. // Funkcja "odmalowujaca" komponent
  58. void MyWindow::paintEvent(QPaintEvent*)
  59. {
  60. // Obiekt klasy QPainter pozwala nam rysowac na komponentach
  61. QPainter p(this);
  62.  
  63. // Rysuje obrazek "img" w punkcie (poczX,poczY)
  64. // (tu bedzie lewy gorny naroznik)
  65. p.drawImage(poczX,poczY,*img);
  66. }
  67.  
  68.  
  69. // Funkcja (slot) wywolywana po nacisnieciu przycisku "Czysc" (cleanButton)
  70. void MyWindow::on_cleanButton_clicked()
  71. {
  72. // Funkcja czysci (zamalowuje na bialo) obszar rysowania
  73. // definicja znajduje sie ponizej
  74. czysc();
  75.  
  76. // Funkcja "update()" powoduje ponowne "namalowanie" calego komponentu
  77. // Wywoluje funkcje "paintEvent"
  78. update();
  79. }
  80.  
  81.  
  82. // Funkcja (slot) wywolywana po nacisnieciu przycisku "Rysuj 1" (draw1Button)
  83. void MyWindow::on_draw1Button_clicked()
  84. {
  85. rysuj1();
  86. update();
  87. }
  88.  
  89. // Funkcja (slot) wywolywana po nacisnieciu przycisku "Rysuj 2" (draw2Button)
  90. void MyWindow::on_draw2Button_clicked()
  91. {
  92. rysuj2();
  93. update();
  94. }
  95.  
  96. // Funkcja powoduje wyczyszczenie (zamalowanie na bialo)
  97. // obszaru rysowania
  98. void MyWindow::czysc()
  99. {
  100. // Wskaznik za pomoca, ktorego bedziemy modyfikowac obraz
  101. unsigned char *ptr;
  102.  
  103. // Funkcja "bits()" zwraca wskaznik do pierwszego piksela danych
  104. ptr = img->bits();
  105.  
  106. int i,j;
  107.  
  108. // Przechodzimy po wszystkich wierszach obrazu
  109. for(i=0; i<wys; i++)
  110. {
  111. // Przechodzimy po pikselach danego wiersza
  112. // W kazdym wierszu jest "szer" pikseli (tzn. 4 * "szer" bajtow)
  113. for(j=0; j<szer; j++)
  114. {
  115. ptr[szer*4*i + 4*j]=255; // Skladowa BLUE
  116. ptr[szer*4*i + 4*j + 1] = 255; // Skladowa GREEN
  117. ptr[szer*4*i + 4*j + 2] = 255; // Skladowa RED
  118. }
  119. }
  120. }
  121.  
  122.  
  123. // Funkcja powoduje zamalowanie obszaru rysowania pewnym wzorem
  124. void MyWindow::rysuj1()
  125. {
  126. unsigned char *ptr;
  127. ptr = img->bits();
  128. int szer = img->width();
  129. int wys = img->height();
  130.  
  131. int i,j;
  132. for(i=0;i<wys;i++)
  133. {
  134. for(j=0;j<szer ;j++)
  135. {
  136. ptr[szer*4*i + 4*j]=i;
  137. ptr[szer*4*i + 4*j + 1] = j;
  138. ptr[szer*4*i + 4*j + 2] = i*j;
  139. }
  140. }
  141. }
  142.  
  143. // Funkcja powoduje zamalowanie obszaru rysowania pewnym wzorem
  144. void MyWindow::rysuj2()
  145. {
  146. unsigned char *ptr;
  147. ptr = img->bits();
  148. int szer = img->width();
  149. int wys = img->height();
  150.  
  151. int i,j;
  152. for(i=0;i<wys;i++)
  153. {
  154. for(j=0;j<szer ;j++)
  155. {
  156. ptr[szer*4*i + 4*j]=i;
  157. ptr[szer*4*i + 4*j + 1] = j;
  158. ptr[szer*4*i + 4*j + 2] = i+j;
  159. }
  160. }
  161. }
  162.  
  163. // Funkcja (slot) wywolywana po nacisnieciu przycisku myszy (w glownym oknie)
  164. void MyWindow::mousePressEvent(QMouseEvent *event)
  165. {
  166. // Pobieramy wspolrzedne punktu klikniecia
  167. int x = event->x();
  168. int y = event->y();
  169.  
  170. // Sa to wspolrzedne wzgledem glownego okna,
  171. // Musimy odjac od nich wpolrzedne lewego gornego naroznika rysunku
  172.  
  173. x -= poczX;
  174. y -= poczY;
  175.  
  176. int kolor = 0;
  177. unsigned char *ptr;
  178. ptr = img->bits();
  179.  
  180. // Sprawdzamy ktory przycisk myszy zostal klkniety
  181. if(event->button() == Qt::LeftButton)
  182. {
  183. // jezeli lewy to ustawiamy kolor na czarny
  184. kolor = 0;
  185.  
  186. }
  187. else
  188. {
  189. // jezeli prawy to ustawiamy kolor na bialy
  190. kolor = 255;
  191. }
  192.  
  193. // Sprawdzamy czy klikniecie nastapilo w granicach rysunku
  194. if ((x>=0)&&(y>=0)&&(x<szer)&&(y<wys))
  195. {
  196.  
  197. // Ustawiamy kolor kliknietego piksela na bialy lub czarny
  198. ptr[szer*4*y + 4*x] = kolor;
  199. ptr[szer*4*y + 4*x + 1] = kolor;
  200. ptr[szer*4*y + 4*x + 2] = kolor;
  201. }
  202.  
  203. // Odswiezamy komponent
  204. update();
  205.  
  206. }
  207.  
  208.  
  209.  
  210.  
  211.  
  212.  
  213.  
  214.  
  215. void MyWindow::on_radioButton_3_clicked(bool checked)
  216. {
  217. if(checked){
  218. clickedg = false;
  219. clickedr = true;
  220. clickedb = false;
  221. }
  222.  
  223. }
  224.  
  225. void MyWindow::on_radioButton_4_clicked(bool checked)
  226. {
  227. if(checked){
  228. clickedg = true;
  229. clickedr = false;
  230. clickedb = false;
  231. }
  232. }
  233.  
  234. void MyWindow::on_radioButton_5_clicked(bool checked)
  235. {
  236. if(checked){
  237. clickedg = false;
  238. clickedr = false;
  239. clickedb = true;
  240. }
  241. }
  242. int MyWindow::HSVtoRGB(int H, double S, double V, char c){
  243. double C = S * V;
  244. double X = C * (1 - abs(fmod(H / 60.0, 2) - 1));
  245. double m = V - C;
  246. double Rs, Gs, Bs;
  247. if(H >= 0 && H < 60) {
  248. Rs = C;
  249. Gs = X;
  250. Bs = 0;
  251. }
  252. else if(H >= 60 && H < 120) {
  253. Rs = X;
  254. Gs = C;
  255. Bs = 0;
  256. }
  257. else if(H >= 120 && H < 180) {
  258. Rs = 0;
  259. Gs = C;
  260. Bs = X;
  261. }
  262. else if(H >= 180 && H < 240) {
  263. Rs = 0;
  264. Gs = X;
  265. Bs = C;
  266. }
  267. else if(H >= 240 && H < 300) {
  268. Rs = X;
  269. Gs = 0;
  270. Bs = C;
  271. }
  272. else {
  273. Rs = C;
  274. Gs = 0;
  275. Bs = X;
  276. }
  277.  
  278. if(c == 'r'){
  279. return (Rs + m) * 255;
  280. }
  281. if(c == 'g'){
  282. return (Gs + m) * 255;
  283. }
  284. if(c == 'b'){
  285. return (Bs + m) * 255;
  286. }
  287. }
  288. void MyWindow::on_verticalSlider_sliderMoved(int position)
  289. {
  290. unsigned char *ptr;
  291. ptr = img->bits();
  292. if(rh == true){
  293. if(clickedr == false){
  294. for(int i = 0; i < szer ; i++){
  295. for(int j = 0; j < wys ; j++){
  296. ptr[szer*4*j + 4*i] = 255 - i/2;
  297. ptr[szer*4*j + 4*i + 1] = j/2;
  298. ptr[szer*4*j + 4*i + 2] = position;
  299.  
  300. }
  301. }
  302. }
  303. }
  304. update();
  305.  
  306.  
  307. }
  308.  
  309. void MyWindow::on_verticalSlider_2_sliderMoved(int position)
  310. {
  311. unsigned char *ptr;
  312. ptr = img->bits();
  313. if(rh == true){
  314. if(clickedg == false){
  315. for(int i = 0; i < szer ; i++){
  316. for(int j = 0; j < wys ; j++){
  317. ptr[szer*4*j + 4*i] = 255 - i/2;
  318. ptr[szer*4*j + 4*i + 1] = position;
  319. ptr[szer*4*j + 4*i + 2] = j/2;
  320. }
  321. }
  322. update();
  323. }
  324. }
  325. }
  326.  
  327. void MyWindow::on_verticalSlider_3_sliderMoved(int position)
  328. {
  329. unsigned char *ptr;
  330. ptr = img->bits();
  331. if(rh == true){
  332. if(clickedb == false){
  333. for(int i = 0; i < szer ; i++){
  334. for(int j = 0; j < wys ; j++){
  335. ptr[szer*4*j + 4*i] = position;
  336. ptr[szer*4*j + 4*i + 1] = 255 - i/2;
  337. ptr[szer*4*j + 4*i + 2] = j/2;
  338. }
  339. }
  340. update();
  341. }
  342. }
  343. }
  344.  
  345. void MyWindow::on_spinBox_valueChanged(int arg1)
  346. {
  347. unsigned char *ptr;
  348. ptr = img->bits();
  349. choice = arg1;
  350. if(clickedr == true){
  351. for(int i = 0; i < szer ; i++){
  352. for(int j = 0; j < wys ; j++){
  353. ptr[szer*4*j + 4*i + 2] = choice;
  354. }
  355. }
  356. }
  357. if(clickedg == true){
  358. for(int i = 0; i < szer ; i++){
  359. for(int j = 0; j < wys ; j++){
  360. ptr[szer*4*j + 4*i + 1] = choice;
  361. }
  362. }
  363. }
  364. if(clickedb == true){
  365. for(int i = 0; i < szer ; i++){
  366. for(int j = 0; j < wys ; j++){
  367. ptr[szer*4*j + 4*i] = choice;
  368. }
  369. }
  370. }
  371. }
  372.  
  373. void MyWindow::on_radioButton_clicked(bool checked)
  374. {
  375. if(checked){
  376. rh = true;
  377. unsigned char *ptr;
  378. ptr = img->bits();
  379. for(int i = 0; i < szer ; i++){
  380. for(int j = 0; j < wys ; j++){
  381. ptr[szer*4*j + 4*i] = 0;
  382. ptr[szer*4*j + 4*i + 1] = 0;
  383. ptr[szer*4*j + 4*i + 2] = 0;
  384. }
  385. }
  386. update();
  387. }
  388. }
  389.  
  390.  
  391. void MyWindow::on_radioButton_2_clicked(bool checked)
  392. {
  393. if(checked){
  394. rh = false;
  395. unsigned char *ptr;
  396. ptr = img->bits();
  397. for(int i = 0; i < szer ; i++){
  398. for(int j = 0; j < wys ; j++){
  399. ptr[szer*4*j + 4*i] = 0;
  400. ptr[szer*4*j + 4*i + 1] = 0;
  401. ptr[szer*4*j + 4*i + 2] = 0;
  402. }
  403. }
  404. update();
  405. }
  406. }
  407.  
  408. void MyWindow::on_verticalSlider_4_sliderMoved(int position)
  409. {
  410. H = position ;
  411. unsigned char *ptr;
  412. ptr = img->bits();;
  413. if(rh == false){
  414. for(int i = 0; i < szer ; i++){
  415. for(int j = 0; j < wys ; j++){
  416. ptr[szer*4*j + 4*i] = HSVtoRGB(H,(double)i/szer,(double)j/wys,'b');
  417. ptr[szer*4*j + 4*i + 1] = HSVtoRGB(H,(double)i/szer,(double)j/wys,'g');
  418. ptr[szer*4*j + 4*i + 2] = HSVtoRGB(H,(double)i/szer,(double)j/wys,'r');
  419. }
  420. }
  421. update();
  422. }
  423.  
  424. }
  425.  
  426. void MyWindow::on_verticalSlider_6_sliderMoved(int position)
  427. {
  428. S = (double)position / 100;
  429. unsigned char *ptr;
  430. ptr = img->bits();
  431. if(rh == false){
  432. for(int i = 0; i < szer ; i++){
  433. for(int j = 0; j < wys ; j++){
  434. ptr[szer*4*j + 4*i] = HSVtoRGB(i/2,S,(double)j/wys,'b');
  435. ptr[szer*4*j + 4*i + 1] = HSVtoRGB(i/2,S,(double)j/wys,'g');
  436. ptr[szer*4*j + 4*i + 2] = HSVtoRGB(i/2,S,(double)j/wys,'r');
  437. }
  438. }
  439. update();
  440. }
  441. }
  442.  
  443. void MyWindow::on_verticalSlider_5_sliderMoved(int position)
  444. {
  445. V = (double)position / 100;
  446. unsigned char *ptr;
  447. ptr = img->bits();
  448. if(rh == false){
  449. for(int i = 0; i < szer ; i++){
  450. for(int j = 0; j < wys ; j++){
  451. ptr[szer*4*j + 4*i] = HSVtoRGB((double)i/2,(double)j/wys,V,'b');
  452. ptr[szer*4*j + 4*i + 1] = HSVtoRGB((double)i/2,(double)j/wys,V,'g');
  453. ptr[szer*4*j + 4*i + 2] = HSVtoRGB((double)i/2,(double)j/wys,V,'r');
  454. }
  455. }
  456. update();
  457. }
  458.  
  459. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement