-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
43 changed files
with
23,500 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,188 @@ | ||
#include "BMPFormater.h" | ||
|
||
#include<iostream> | ||
#include<fstream> | ||
Layer* BMPFormater::Ucitaj_Sliku(const char* ch, int prov) { | ||
uint32_t pocetak_piksela, fleg; | ||
int32_t sirina, visina; | ||
uint16_t bpp, tip; | ||
std::vector<std::vector<Pixel>> sloj; | ||
std::ifstream file((char*)ch, std::ios::binary); | ||
if (file) {//dohvatamo heder | ||
file.read((char*)&tip, 2); | ||
if (tip != 0x4D42) { | ||
std::cout << "NEPOSTOJECI FORMAT\n"; | ||
return nullptr; | ||
} | ||
file.seekg(10); | ||
|
||
file.read((char*)&pocetak_piksela, 4); | ||
file.seekg(18); | ||
|
||
file.read((char*)&sirina, 4); | ||
file.read((char*)&visina, 4); | ||
// std::cout << sirina << " " << visina << "\n"; | ||
file.seekg(28); | ||
|
||
file.read((char*)&bpp, 2); | ||
file.read((char*)&fleg, 4); | ||
file.seekg(pocetak_piksela); | ||
if (bpp == 24) {//ako je 24b format dohvatamo rgb | ||
|
||
uint8_t r,g,b; | ||
uint32_t pend; | ||
int pending = 4 - (3 * sirina % 4); | ||
if (pending == 4)pending = 0; | ||
|
||
for (int j = 0; j < visina; j++) { | ||
std::vector<Pixel> pom; | ||
for (int i = 0; i < sirina ; i++) { | ||
file.read((char*)&b, 1); | ||
file.read((char*)&g, 1); | ||
file.read((char*)&r, 1); | ||
|
||
|
||
Pixel p1((int)r, (int)g, (int)b); | ||
pom.push_back(p1); | ||
|
||
} | ||
file.read((char*)&pend, pending); | ||
sloj.push_back(pom); | ||
} | ||
|
||
|
||
Layer* l = new Layer(sloj, visina, sirina, prov); | ||
return l; | ||
} | ||
else { //ako je 32b format onda rgbalfa | ||
uint8_t g,b,r,alf; | ||
for (int j = 0; j < visina; j++) { | ||
std::vector<Pixel> pom; | ||
for (int i = 0; i < sirina ; i++) { | ||
file.read((char*)&b, 1); | ||
file.read((char*)&g, 1); | ||
file.read((char*)&r, 1); | ||
file.read((char*)&alf, 1); | ||
|
||
Pixel p1(r, g, b,alf); | ||
pom.push_back(p1); | ||
|
||
} | ||
sloj.push_back(pom); | ||
} | ||
Layer* l = new Layer(sloj, visina, sirina, prov);//pravimo novi sloj sa informacijama iz fajla | ||
return l; | ||
} | ||
} | ||
else { // fajl nije otvoren | ||
|
||
std::cout << "LOSA PUTANJA DO FAJLA.STVORICE SE PRAZAN SLOJ"<< std::endl; | ||
Layer* l = new Layer(); | ||
return l; | ||
} | ||
} | ||
|
||
void BMPFormater::Sacuvaj_Sliku(const char*ch, std::vector<std::vector<Pixel>> l) { | ||
std::ofstream file(ch, std::ios::binary); | ||
|
||
if (file) { | ||
int32_t sir = l[0].size(); | ||
int32_t vis = l.size(); | ||
uint8_t bit; | ||
//setujemo heder | ||
bit = 0x42; | ||
file.write((char*)&bit, 1); | ||
bit = 0x4d; | ||
file.write((char*)&bit, 1); | ||
|
||
int pend = (((3 * sir) % 4) == 0 )? 0 : (4 - ((3 * sir )% 4)); | ||
uint32_t vel = (vis * (3 * sir + pend)); | ||
|
||
uint32_t size = vel + 54; | ||
file.write((char*)&size, 4); | ||
bit = 0x00; | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
bit = 0x36; | ||
file.write((char*)&bit, 1); | ||
bit = 0x00; | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
bit = 0x28; | ||
file.write((char*)&bit, 1); | ||
bit = 0x00; | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&sir, 4); | ||
file.write((char*)&vis, 4); | ||
bit = 0x01; | ||
file.write((char*)&bit, 1); | ||
bit = 0x00; | ||
file.write((char*)&bit, 1); | ||
bit = 0x18; | ||
file.write((char*)&bit, 1); | ||
bit = 0x00; | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
//velicina bitmape4 | ||
|
||
file.write((char*)&vel, 4); | ||
bit = 0x13; | ||
file.write((char*)&bit, 1); | ||
bit = 0x0b; | ||
file.write((char*)&bit, 1); | ||
bit = 0x00; | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
|
||
bit = 0x13; | ||
file.write((char*)&bit, 1); | ||
bit = 0x0b; | ||
file.write((char*)&bit, 1); | ||
bit = 0x00; | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
file.write((char*)&bit, 1); | ||
|
||
bit = 0x00; | ||
//smjestamo piksele bajt po bajt | ||
for (auto a : l) { | ||
|
||
for (auto pix:a) | ||
{ | ||
int b = pix.Get_blue(); | ||
int r = pix.Get_red(); | ||
int g = pix.Get_green(); | ||
file.write((char*)&b, 1); | ||
file.write((char*)&g, 1); | ||
file.write((char*)&r, 1); | ||
|
||
} | ||
for (int i = 0; i < pend; i++) | ||
{ | ||
file.write((char*)&bit, 1); | ||
} | ||
} | ||
file.close(); | ||
} | ||
else { | ||
|
||
std::cout << "DESILA SE GRESKA\n"; | ||
return; | ||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,11 @@ | ||
#pragma once | ||
#include"Layer.h" | ||
|
||
class BMPFormater | ||
{ | ||
public: | ||
static Layer* Ucitaj_Sliku(const char* ch, int prov); | ||
BMPFormater() {} | ||
static void Sacuvaj_Sliku(const char*ch,std::vector<std::vector<Pixel>>l); | ||
}; | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,3 @@ | ||
#include "BasicOperation.h" | ||
|
||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,177 @@ | ||
#pragma once | ||
#include"Operation.h" | ||
// sve klase su izvedene iz klase Operation i imaju virtuelne metode izvrsi, get_name i kopiju | ||
class Sabiranje:public Operation | ||
{ | ||
public: | ||
Sabiranje(int konst) :Operation(konst) {} | ||
virtual void izvrsi(Pixel**p)override { | ||
|
||
(**p) += konst; | ||
} | ||
|
||
virtual const char* Get_name()const { | ||
return "Sum"; | ||
} | ||
virtual Sabiranje* kopija()override { | ||
return new Sabiranje(konst); | ||
} | ||
}; | ||
|
||
class Oduzimanje :public Operation { | ||
public: | ||
Oduzimanje(int konst) :Operation(konst) {} | ||
virtual void izvrsi(Pixel** p)override { | ||
|
||
(**p) -= konst; | ||
} | ||
virtual const char* Get_name()const { | ||
return "Sub"; | ||
} | ||
virtual Oduzimanje* kopija()override { | ||
return new Oduzimanje(konst); | ||
} | ||
}; | ||
|
||
class Mnozenje :public Operation { | ||
public: | ||
Mnozenje(int konst) :Operation(konst) {} | ||
virtual void izvrsi(Pixel** p)override { | ||
|
||
(**p)*= konst; | ||
} | ||
virtual const char* Get_name()const { | ||
return "Mul"; | ||
} | ||
virtual Mnozenje* kopija()override { | ||
return new Mnozenje(konst); | ||
} | ||
}; | ||
class Dijeljenje :public Operation { | ||
public: | ||
Dijeljenje(int konst) :Operation(konst) {} | ||
virtual void izvrsi(Pixel** p)override { | ||
|
||
(**p) /= konst; | ||
} | ||
virtual const char* Get_name()const { | ||
return "Div"; | ||
} | ||
virtual Dijeljenje* kopija()override { | ||
return new Dijeljenje(konst); | ||
} | ||
}; | ||
class IOduzimanje :public Operation { | ||
public: | ||
IOduzimanje(int konst) :Operation(konst) {} | ||
virtual void izvrsi(Pixel** p)override { | ||
|
||
(**p) - konst; | ||
} | ||
virtual const char* Get_name()const { | ||
return "Isub"; | ||
} | ||
|
||
virtual IOduzimanje* kopija()override { | ||
return new IOduzimanje(konst); | ||
} | ||
}; | ||
class IDijeljenje :public Operation { | ||
public: | ||
IDijeljenje(int konst) :Operation(konst) {} | ||
virtual void izvrsi(Pixel **p)override { | ||
|
||
(**p) / konst; | ||
} | ||
virtual const char* Get_name()const { | ||
return "Idiv"; | ||
} | ||
virtual IDijeljenje* kopija()override { | ||
return new IDijeljenje(konst); | ||
} | ||
}; | ||
|
||
class Max :public Operation { | ||
public: | ||
Max(int konst) :Operation(konst) {} | ||
virtual void izvrsi(Pixel** p)override { | ||
|
||
if ((**p).Get_red() < konst) { (**p).Set_red(konst); } | ||
if ((**p).Get_green() < konst) { (**p).Set_green(konst); } | ||
if ((**p).Get_blue() < konst) { (**p).Set_blue(konst); } | ||
} | ||
virtual const char* Get_name()const { | ||
return "Max"; | ||
} | ||
virtual Max* kopija()override { | ||
return new Max(konst); | ||
} | ||
}; | ||
|
||
class Min :public Operation { | ||
public: | ||
Min(int konst) :Operation(konst) {} | ||
virtual void izvrsi(Pixel** p)override { | ||
|
||
if ((**p).Get_red() > konst) { (**p).Set_red(konst); } | ||
if ((**p).Get_green() > konst) { (**p).Set_green(konst); } | ||
if ((**p).Get_blue() > konst) { (**p).Set_blue(konst); } | ||
} | ||
virtual const char* Get_name()const { | ||
return "Min"; | ||
} | ||
virtual Min* kopija()override { | ||
return new Min(konst); | ||
} | ||
}; | ||
|
||
class Pow :public Operation { | ||
public: | ||
Pow(int konst) :Operation(konst) {} | ||
virtual void izvrsi(Pixel** p)override { | ||
|
||
(**p).Set_red(pow((**p).Get_red() ,konst)); | ||
(**p).Set_green(pow((**p).Get_green(),konst)); | ||
(**p).Set_blue(pow((**p).Get_blue(),konst)); | ||
} | ||
virtual const char* Get_name()const { | ||
return "Pow"; | ||
} | ||
virtual Pow* kopija()override { | ||
return new Pow(konst); | ||
} | ||
}; | ||
|
||
class Log :public Operation { | ||
public: | ||
Log(int konst) :Operation(konst) {} | ||
virtual void izvrsi(Pixel** p)override { | ||
|
||
(**p).Set_red(log((**p).Get_red())/log( konst)); | ||
(**p).Set_green(log((**p).Get_green()) / log(konst)); | ||
(**p).Set_blue(log((**p).Get_blue() )/ log(konst)); | ||
} | ||
virtual const char* Get_name()const { | ||
return "Log"; | ||
} | ||
virtual Log* kopija()override { | ||
return new Log(konst); | ||
} | ||
}; | ||
|
||
class Abs :public Operation { | ||
public: | ||
Abs(int konst=0) :Operation(konst) {} | ||
virtual void izvrsi(Pixel** p)override { | ||
|
||
(**p).Set_red(abs((**p).Get_red())); | ||
(**p).Set_green(abs((**p).Get_green())); | ||
(**p).Set_blue(abs((**p).Get_blue())); | ||
} | ||
virtual const char* Get_name()const { | ||
return "Abs"; | ||
} | ||
virtual Abs* kopija()override { | ||
return new Abs(konst); | ||
} | ||
}; |
Oops, something went wrong.