Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #define _CRT_SECURE_NO_WARNINGS
- #include <iostream>
- #include <fstream>
- #include <string>
- #include <vector>
- using namespace std;
- struct Header {
- char head[2];
- int width;
- int height;
- int total;
- };
- class P5 {
- private:
- char **data;
- char **temp;
- public:
- P5(Header &header, ifstream &cin) {
- data = new char*[header.height];
- for (int i = 0; i < header.height; i++)
- data[i] = new char[header.width];
- char p;
- cin.read(&p, 1);
- for (int i = 0; i < header.height; i++)
- cin.read(data[i], header.width);
- }
- void invertion(Header &header) {
- for (int i = 0; i < header.height; i++)
- for (int j = 0; j < header.width; j++)
- data[i][j] = abs(data[i][j] - 255);
- }
- void goriz(Header &header) {
- for (int i = 0; i < header.height; i++)
- for (int j = 0; j < header.width / 2; j++)
- swap(data[i][j], data[i][header.width - j - 1]);
- }
- void vert(Header &header) {
- for (int i = 0; i < header.width; i++)
- for (int j = 0; j < header.height / 2; j++)
- swap(data[j][i], data[header.height - j - 1][i]);
- }
- void povpo(Header &header) {
- temp = new char*[header.width];
- for (int i = 0; i < header.width; i++)
- temp[i] = new char[header.height];
- for (int i = 0; i < header.width; i++)
- for (int j = 0; j < header.height; j++)
- temp[i][j] = data[header.height - j - 1][i];
- }
- void povpro(Header &header) {
- temp = new char*[header.width];
- for (int i = 0; i < header.width; i++)
- temp[i] = new char[header.height];
- for (int i = 0; i < header.width; i++)
- for (int j = 0; j < header.height; j++)
- temp[i][j] = data[j][header.width - i - 1];
- }
- void save(Header &header, char *argv[]) {
- ofstream cout(string(argv[2]) + ".pgm", ios::binary);
- if (argv[3][0] == '0' || argv[3][0] == '1' || argv[3][0] == '2') {
- cout << "P5" << '\n';
- cout << header.width << ' ' << header.height << '\n';
- cout << header.total << '\n';
- for (int i = 0; i < header.height; i++)
- cout.write(data[i], header.width);
- for (int i = 0; i < header.height; i++)
- delete[] data[i];
- }
- else if (argv[3][0] == '3' || argv[3][0] == '4') {
- cout << "P5" << '\n';
- cout << header.height << ' ' << header.width << '\n';
- cout << header.total << '\n';
- for (int i = 0; i < header.width; i++)
- cout.write(temp[i], header.height);
- for (int i = 0; i < header.width; i++)
- delete[] temp[i];
- }
- cout.close();
- }
- };
- class P6 {
- private:
- char **data;
- char **temp;
- public:
- P6(Header &header, ifstream &cin) {
- data = new char*[header.height];
- for (int i = 0; i < header.height; i++)
- data[i] = new char[header.width * 3];
- char p;
- cin.read(&p, 1);
- for (int i = 0; i < header.height; i++)
- cin.read(data[i], header.width * 3);
- }
- void invertion(Header &header) {
- for (int i = 0; i < header.height; i++)
- for (int j = 0; j < header.width * 3; j+=4)
- data[i][j] = abs(data[i][j] - 90);
- }
- void goriz(Header &header) {
- for (int i = 0; i < header.height; i++)
- for (int j = 0; j < 3 * header.width / 2; j += 3) {
- swap(data[i][j], data[i][header.width * 3 - j - 3]);
- swap(data[i][j + 1], data[i][header.width * 3 - j - 2]);
- swap(data[i][j + 2], data[i][header.width * 3 - j - 1]);
- }
- }
- void vert(Header &header) {
- for (int i = 0; i < 3 * header.width; i++)
- for (int j = 0; j < header.height / 2; j++) {
- swap(data[j][i], data[header.height - j - 1][i]);
- }
- }
- void povpo(Header &header) {
- temp = new char*[header.width];
- for (int i = 0; i < header.width; i++)
- temp[i] = new char[header.height * 3];
- int k = 1;
- for (int i = 0; i < header.width; i++)
- for (int j = 0; j < header.height * 3; j += 3) {
- if (j == 0)
- k = 0;
- temp[i][j] = data[header.height + k - 1][i * 3];
- temp[i][j + 1] = data[header.height + k - 1][i * 3 + 1];
- temp[i][j + 2] = data[header.height + k - 1][i * 3 + 2];
- k--;
- }
- }
- void povpro(Header &header) {
- temp = new char*[header.width];
- for (int i = 0; i < header.width; i++)
- temp[i] = new char[header.height * 3];
- int k = 1;
- for (int i = 0; i < header.width; i++)
- for (int j = 0; j < header.height * 3; j += 3) {
- if (j == 0)
- k = 0;
- temp[i][j] = data[k][header.width * 3 - 3 * i - 3];
- temp[i][j + 1] = data[k][header.width * 3 - 3 * i - 2];
- temp[i][j + 2] = data[k][header.width * 3 - 3 * i - 1];
- k++;
- }
- }
- void save(Header &header, char *argv[]) {
- ofstream cout(string(argv[2]) + ".ppm", ios::binary);
- if (argv[3][0] == '0' || argv[3][0] == '1' || argv[3][0] == '2') {
- cout << "P6" << '\n';
- cout << header.width << ' ' << header.height << '\n';
- cout << header.total << '\n';
- for (int i = 0; i < header.height; i++)
- cout.write(data[i], header.width * 3);
- for (int i = 0; i < header.height; i++)
- delete[] data[i];
- }
- else if (argv[3][0] == '3' || argv[3][0] == '4') {
- cout << "P6" << '\n';
- cout << header.height << ' ' << header.width << '\n';
- cout << header.total << '\n';
- for (int i = 0; i < header.width; i++)
- cout.write(temp[i], header.height * 3);
- for (int i = 0; i < header.width; i++)
- delete[] temp[i];
- }
- cout.close();
- }
- };
- int main(int argc, char *argv[]) {
- Header header;
- string file = argv[1];
- int size = file.size() - 1;
- ifstream cin(file, ios::binary);
- if (argc < 4) {
- cout << "Not enought arguments";
- return 0;
- }
- if (!cin) {
- cout << "File aren't found";
- return 0;
- }
- else if (!(file[size] == 'm'
- && (file[size - 1] == 'p' || file[size - 1] == 'g')
- && file[size - 2] == 'p' && file[size - 3] == '.')) {
- cout << "Invalid format";
- return 0;
- }
- cin >> header.head;
- cin >> header.width >> header.height >> header.total;
- if (header.head[1] == '5') {
- P5 file(header, cin);
- if (argv[3][0] == '0')
- file.invertion(header);
- else if (argv[3][0] == '1') //отобрзить по горизонтали
- file.goriz(header);
- else if (argv[3][0] == '2') //отобрзить по вертикали
- file.vert(header);
- else if (argv[3][0] == '3') //поворот на 90* по
- file.povpo(header);
- else if (argv[3][0] == '4') //поворот на 90* прот
- file.povpro(header);
- file.save(header, argv);
- }
- else if (header.head[1] == '6') {
- P6 file(header, cin);
- if (argv[3][0] == '0')
- file.invertion(header);
- else if (argv[3][0] == '1') //отобрзить по горизонтали
- file.goriz(header);
- else if (argv[3][0] == '2') //отобрзить по вертикали
- file.vert(header);
- else if (argv[3][0] == '3') //поворот на 90* по
- file.povpo(header);
- else if (argv[3][0] == '4') //поворот на 90* прот
- file.povpro(header);
- file.save(header, argv);
- }
- cin.close();
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement