Advertisement
ddeexxiikk

Pliki.cpp

Feb 6th, 2025
20
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 16.44 KB | None | 0 0
  1. // funkcje związane z zapisywaniem i odczytywaniem danych z plików
  2. #include "SM2024-Funkcje.h"
  3. #include "SM2024-Zmienne.h"
  4. #include "SM2024-Paleta.h"
  5. #include "SM2024-MedianCut.h"
  6. #include "SM2024-Pliki.h"
  7. #include "SM2024-Kompresja.h"
  8. #include <vector>
  9.  
  10. void zapisywanie_pliku()
  11. {
  12.     cout << "\nKolor:\n[1] - skala szarosci\n[2] - kolor\n\n";
  13.     cout << "Tryb:\n[1] - 15 bitowy (RGB555)\n[2] - 24 bitowy (RGB888)\n[3] - 24 bitowy (YUV888)\n\n";
  14.     cout << "Dithering dla RGB555:\n[0] - inny wybor niz RGB555\n[1] - nie\n[2] - tak\n\n";
  15.     cout << "Algorytm predykcji typu 1:\n[1] - nie\n[2] - tak\n\n";
  16.     cout << "Kompresja bezstratna ByteRun:\n[1] - nie\n[2] - tak\n\n";
  17.     cout << "Podprobkowanie skladowych chrominacji:\n[1] - nie\n[2] - tak\n\n";
  18.     cout << "Kompresja stratna DCT:\n[1] - nie\n[2] - tak\n";
  19.     cout << "\nPodaj opcje: ";
  20.  
  21.     int kolor, tryb, dithering, predykcja, ByteRun, podprobkowanie, DCT;
  22.     cin >> kolor >> tryb >> dithering >> predykcja >> ByteRun >> DCT;
  23.     zapisz_do_pliku_uniwersalna("obraz.z13", szerokosc / 2, wysokosc / 2, kolor, tryb, dithering, predykcja, podprobkowanie, ByteRun, DCT);
  24. }
  25.  
  26. void zapisz_do_pliku_uniwersalna(string plik, Uint16 szerokosc_obrazka, Uint16 wysokosc_obrazka, int kolor, int tryb, int dithering, int predykcja, int podprobkowanie, int ByteRun, int DCT)
  27. {
  28.     ofstream wyjscie(plik, ios::binary);
  29.  
  30.     Uint8* komponent1 = new Uint8[szerokosc_obrazka*wysokosc_obrazka];
  31.     Uint8* komponent2 = new Uint8[szerokosc_obrazka*wysokosc_obrazka];
  32.     Uint8* komponent3 = new Uint8[szerokosc_obrazka*wysokosc_obrazka];
  33.  
  34.     vector<Uint8> vec1;
  35.     vector<Uint8> vec2;
  36.     vector<Uint8> vec3;
  37.  
  38.     switch(kolor)
  39.     {
  40.     case 1:
  41.         {
  42.             for(int y = 0; y < wysokosc_obrazka; y++)
  43.             {
  44.                 for(int x = 0; x < szerokosc_obrazka; x++)
  45.                 {
  46.                     SDL_Color kolor = getPixel(x, y);
  47.                     int szary = 0.299 * kolor.r + 0.587 * kolor.g + 0.114 * kolor.b;
  48.                     setPixel(x, y, szary, szary, szary);
  49.                 }
  50.             }
  51.             break;
  52.         }
  53.     case 2:
  54.         {
  55.             // brak
  56.             break;
  57.         }
  58.     default:
  59.         {
  60.             cout << "Kolor: zla opcja\n";
  61.             break;
  62.         }
  63.     }
  64.  
  65.     switch(tryb)
  66.     {
  67.     case 1:
  68.         {
  69.             //Dopiero na etapie ditheringu zbieramy dane
  70.             break;
  71.         }
  72.     case 2:
  73.         {
  74.             for(int y = 0; y < wysokosc_obrazka; y++)
  75.             {
  76.                 for(int x = 0; x < szerokosc_obrazka; x++)
  77.                 {
  78.                     SDL_Color pixel = getPixel(x, y);
  79.                     komponent1[y * szerokosc_obrazka + x] = pixel.r;
  80.                     komponent2[y * szerokosc_obrazka + x] = pixel.g;
  81.                     komponent3[y * szerokosc_obrazka + x] = pixel.b;
  82.                 }
  83.             }
  84.             break;
  85.         }
  86.     case 3:
  87.         {
  88.             for(int y = 0; y < wysokosc_obrazka; y++)
  89.             {
  90.                 for(int x = 0; x < szerokosc_obrazka; x++)
  91.                 {
  92.                     SDL_Color pixel = getPixel(x, y);
  93.                     YUV yuv = RGBtoYUV(pixel);
  94.                     komponent1[y * szerokosc_obrazka + x] = yuv.Y;
  95.                     komponent2[y * szerokosc_obrazka + x] = yuv.U;
  96.                     komponent3[y * szerokosc_obrazka + x] = yuv.V;
  97.                 }
  98.             }
  99.             break;
  100.         }
  101.     default:
  102.         {
  103.             cout << "Tryb: zla opcja\n";
  104.             break;
  105.         }
  106.     }
  107.  
  108.     switch(dithering)
  109.     {
  110.     case 0:
  111.         {
  112.             //Inna opcja kolorystyczna
  113.             break;
  114.         }
  115.     case 1:
  116.         {
  117.             //Brak ditheringu dla RGB555
  118.             for(int y = 0; y < wysokosc_obrazka; y++)
  119.             {
  120.                 for(int x = 0; x < szerokosc_obrazka; x++)
  121.                 {
  122.                     SDL_Color pixel = getRGB555(x, y);
  123.                     komponent1[y * szerokosc_obrazka + x] = pixel.r;
  124.                     komponent2[y * szerokosc_obrazka + x] = pixel.g;
  125.                     komponent3[y * szerokosc_obrazka + x] = pixel.b;
  126.                 }
  127.             }
  128.             break;
  129.         }
  130.     case 2:
  131.         {
  132.             //Dithering dla RGB555
  133.             for(int y = 0; y < wysokosc_obrazka; y++)
  134.             {
  135.                 for(int x = 0; x < szerokosc_obrazka; x++)
  136.                 {
  137.                     SDL_Color pixel = Dithering555(x, y);
  138.                     komponent1[y * szerokosc_obrazka + x] = pixel.r;
  139.                     komponent2[y * szerokosc_obrazka + x] = pixel.g;
  140.                     komponent3[y * szerokosc_obrazka + x] = pixel.b;
  141.                 }
  142.             }
  143.             break;
  144.         }
  145.     default:
  146.         {
  147.             cout << "Dithering: zla opcja\n";
  148.             break;
  149.         }
  150.     }
  151.  
  152.     switch(predykcja)
  153.     {
  154.     case 1:
  155.         {
  156.             // brak
  157.             break;
  158.         }
  159.     case 2:
  160.         {
  161.             for(int y = 0; y < wysokosc_obrazka; y++)
  162.             {
  163.                 TheFilterRoznicowy(komponent1+y * szerokosc_obrazka, szerokosc_obrazka);
  164.                 TheFilterRoznicowy(komponent2+y * szerokosc_obrazka, szerokosc_obrazka);
  165.                 TheFilterRoznicowy(komponent3+y * szerokosc_obrazka, szerokosc_obrazka);
  166.  
  167.             }
  168.             break;
  169.         }
  170.     default:
  171.         {
  172.              cout << "Predykcja: zla opcja\n";
  173.              break;
  174.         }
  175.     }
  176.  
  177.     switch(ByteRun)
  178.     {
  179.         case 1:
  180.             {
  181.                 vector<Uint8> temp1(komponent1, komponent1 + szerokosc_obrazka * wysokosc_obrazka);
  182.                 vector<Uint8> temp2(komponent2, komponent2 + szerokosc_obrazka * wysokosc_obrazka);
  183.                 vector<Uint8> temp3(komponent3, komponent3 + szerokosc_obrazka * wysokosc_obrazka);
  184.  
  185.                 vec1 = temp1;
  186.                 vec2 = temp2;
  187.                 vec3 = temp3;
  188.                 break;
  189.             }
  190.         case 2:
  191.             {
  192.                 vec1 = byte_run(komponent1, szerokosc_obrazka * wysokosc_obrazka);
  193.                 vec2 = byte_run(komponent2, szerokosc_obrazka * wysokosc_obrazka);
  194.                 vec3 = byte_run(komponent3, szerokosc_obrazka * wysokosc_obrazka);
  195.                 break;
  196.             }
  197.         default:
  198.             {
  199.                 cout << "ByteRun: zla opcja\n";
  200.             }
  201.     }
  202.  
  203.     delete[] komponent1;
  204.     delete[] komponent2;
  205.     delete[] komponent3;
  206.  
  207.     komponent1 = new Uint8[vec1.size()];
  208.     komponent2 = new Uint8[vec2.size()];
  209.     komponent3 = new Uint8[vec3.size()];
  210.  
  211.     copy(vec1.begin(), vec1.end(), komponent1);
  212.     copy(vec2.begin(), vec2.end(), komponent2);
  213.     copy(vec3.begin(), vec3.end(), komponent3);
  214.  
  215.     vector<komponentDCT> komp1;
  216.     vector<komponentDCT> komp2;
  217.     vector<komponentDCT> komp3;
  218.  
  219.     switch(DCT)
  220.     {
  221.     case 1:
  222.         {
  223.             // brak
  224.             break;
  225.         }
  226.     case 2:
  227.         {
  228.             komp1 = wykonajDCT(komponent1, szerokosc_obrazka, wysokosc_obrazka);
  229.             komp2 = wykonajDCT(komponent2, szerokosc_obrazka, wysokosc_obrazka);
  230.             komp3 = wykonajDCT(komponent3, szerokosc_obrazka, wysokosc_obrazka);
  231.             break;
  232.         }
  233.     default:
  234.         {
  235.             cout << "DCT: zla opcja\n";
  236.         }
  237.     }
  238.  
  239.     char identyfikator[] = "13";
  240.     wyjscie.write((char*)&identyfikator, sizeof(char) * 2);
  241.     wyjscie.write((char*)&szerokosc_obrazka, sizeof(Uint16));
  242.     wyjscie.write((char*)&wysokosc_obrazka, sizeof(Uint16));
  243.     wyjscie.write((char*)&tryb, sizeof(int));
  244.     wyjscie.write((char*)&predykcja, sizeof(int));
  245.     wyjscie.write((char*)&ByteRun, sizeof(int));
  246.     wyjscie.write((char*)&DCT, sizeof(int));
  247.  
  248.     if(DCT == 1)
  249.     {
  250.         int sectionSize=vec1.size();
  251.         wyjscie.write((char*)&sectionSize, sizeof(int));
  252.         for(int i = 0; i < vec1.size(); i++)
  253.         {
  254.             wyjscie.write((char*)&vec1[i], sizeof(Uint8));
  255.         }
  256.  
  257.         sectionSize=vec2.size();
  258.         wyjscie.write((char*)&sectionSize, sizeof(int));
  259.         for(int i = 0; i < vec2.size(); i++)
  260.         {
  261.             wyjscie.write((char*)&vec2[i], sizeof(Uint8));
  262.         }
  263.  
  264.         sectionSize=vec3.size();
  265.         wyjscie.write((char*)&sectionSize, sizeof(int));
  266.          for(int i = 0; i < vec3.size(); i++)
  267.         {
  268.             wyjscie.write((char*)&vec3[i], sizeof(Uint8));
  269.         }
  270.  
  271.         wyjscie.close();
  272.     }
  273.     else
  274.     {
  275.         int sectionSize1 = komp1.size();
  276.         wyjscie.write((char*)&sectionSize1, sizeof(int));
  277.         for(int i = 0; i < komp1.size(); i++)
  278.         {
  279.             int sectionSubSize1 = komp1.at(i).vec.size();
  280.             wyjscie.write((char*)&sectionSubSize1, sizeof(int));
  281.             for(int j = 0; j < komp1.at(i).vec.size(); j++)
  282.             {
  283.                 wyjscie.write((char*)&komp1.at(i).vec.at(j), sizeof(float));
  284.             }
  285.         }
  286.  
  287.         int sectionSize2 = komp2.size();
  288.         wyjscie.write((char*)&sectionSize2, sizeof(int));
  289.         for(int i = 0; i < komp2.size(); i++)
  290.         {
  291.             int sectionSubSize2 = komp2.at(i).vec.size();
  292.             wyjscie.write((char*)&sectionSubSize2, sizeof(int));
  293.             for(int j = 0; j < komp2.at(i).vec.size(); j++)
  294.             {
  295.                 wyjscie.write((char*)&komp2.at(i).vec.at(j), sizeof(float));
  296.             }
  297.         }
  298.  
  299.         int sectionSize3 = komp3.size();
  300.         wyjscie.write((char*)&sectionSize3, sizeof(int));
  301.         for(int i = 0; i < komp3.size(); i++)
  302.         {
  303.             int sectionSubSize3 = komp3.at(i).vec.size();
  304.             wyjscie.write((char*)&sectionSubSize3, sizeof(int));
  305.             for(int j = 0; j < komp3.at(i).vec.size(); j++)
  306.             {
  307.                 wyjscie.write((char*)&komp3.at(i).vec.at(j), sizeof(float));
  308.             }
  309.         }
  310.  
  311.         wyjscie.close();
  312.     }
  313. }
  314.  
  315. void wczytaj_z_pliku_uniwersalna(string plik)
  316. {
  317.     char identyfikator[] = "";
  318.     Uint16 szerokosc_obrazka = 0;
  319.     Uint16 wysokosc_obrazka = 0;
  320.     int tryb = 0;
  321.     int predykcja = 0;
  322.     int ByteRun = 0;
  323.     int DCT = 0;
  324.  
  325.     cout << "Odczytujemy plik " << plik << " uzywajac dedykowanej metody" << endl;
  326.  
  327.     ifstream wejscie(plik, ios::binary);
  328.  
  329.     wejscie.read((char*)&identyfikator, sizeof(char) * 2);
  330.     wejscie.read((char*)&szerokosc_obrazka, sizeof(szerokosc_obrazka));
  331.     wejscie.read((char*)&wysokosc_obrazka, sizeof(wysokosc_obrazka));
  332.     wejscie.read((char*)&tryb, sizeof(tryb));
  333.     wejscie.read((char*)&predykcja, sizeof(predykcja));
  334.     wejscie.read((char*)&ByteRun, sizeof(ByteRun));
  335.     wejscie.read((char*)&DCT, sizeof(DCT));
  336.  
  337.     int sectionSize1=0;
  338.     int sectionSize2=0;
  339.     int sectionSize3=0;
  340.  
  341.     vector<komponentDCT> komp1;
  342.     vector<komponentDCT> komp2;
  343.     vector<komponentDCT> komp3;
  344.  
  345.     vector<Uint8> vec1;
  346.     vector<Uint8> vec2;
  347.     vector<Uint8> vec3;
  348.  
  349.     Uint8* komponent1 = nullptr;
  350.     Uint8* komponent2 = nullptr;
  351.     Uint8* komponent3 = nullptr;
  352.  
  353.     if(DCT == 1)
  354.     {
  355.         wejscie.read((char*)&sectionSize1, sizeof(int));
  356.         komponent1 = new Uint8[sectionSize1];
  357.         for(int i = 0; i < sectionSize1; i++)
  358.         {
  359.             wejscie.read((char*)&komponent1[i], sizeof(Uint8));
  360.             vec1.push_back(komponent1[i]);
  361.         }
  362.  
  363.         wejscie.read((char*)&sectionSize2, sizeof(int));
  364.         komponent2 = new Uint8[sectionSize2];
  365.         for(int i = 0; i < sectionSize2; i++)
  366.         {
  367.             wejscie.read((char*)&komponent2[i], sizeof(Uint8));
  368.             vec2.push_back(komponent2[i]);
  369.         }
  370.  
  371.         wejscie.read((char*)&sectionSize3, sizeof(int));
  372.         komponent3 = new Uint8[sectionSize3];
  373.         for(int i = 0; i < sectionSize3; i++)
  374.         {
  375.             wejscie.read((char*)&komponent3[i], sizeof(Uint8));
  376.             vec3.push_back(komponent3[i]);
  377.         }
  378.     }
  379.     else
  380.     {
  381.         wejscie.read((char*)&sectionSize1, sizeof(int));
  382.         for(int i = 0; i < sectionSize1; i++)
  383.         {
  384.             komponentDCT temp;
  385.             int sectionSubSize1;
  386.             wejscie.read((char*)&sectionSubSize1, sizeof(int));
  387.             temp.vec.resize(sectionSubSize1);
  388.             for(int j = 0; j < sectionSubSize1; j++)
  389.             {
  390.                 wejscie.read((char*)&temp.vec[j], sizeof(float));
  391.             }
  392.             komp1.push_back(temp);
  393.         }
  394.  
  395.         wejscie.read((char*)&sectionSize2, sizeof(int));
  396.         for(int i = 0; i < sectionSize2; i++)
  397.         {
  398.             komponentDCT temp;
  399.             int sectionSubSize2;
  400.             wejscie.read((char*)&sectionSubSize2, sizeof(int));
  401.             temp.vec.resize(sectionSubSize2);
  402.             for(int j = 0; j < sectionSubSize2; j++)
  403.             {
  404.                 wejscie.read((char*)&temp.vec[j], sizeof(float));
  405.             }
  406.             komp2.push_back(temp);
  407.         }
  408.  
  409.         wejscie.read((char*)&sectionSize3, sizeof(int));
  410.         for(int i = 0; i < sectionSize3; i++)
  411.         {
  412.             komponentDCT temp;
  413.             int sectionSubSize3;
  414.             wejscie.read((char*)&sectionSubSize3, sizeof(int));
  415.             temp.vec.resize(sectionSubSize3);
  416.             for(int j = 0; j < sectionSubSize3; j++)
  417.             {
  418.                 wejscie.read((char*)&temp.vec[j], sizeof(float));
  419.             }
  420.             komp3.push_back(temp);
  421.         }
  422.     }
  423.  
  424.     switch(DCT)
  425.     {
  426.     case 1:
  427.         {
  428.             // brak
  429.             break;
  430.         }
  431.     case 2:
  432.         {
  433.             komponent1 = wykonajIDCT(komp1, szerokosc_obrazka, wysokosc_obrazka);
  434.             komponent2 = wykonajIDCT(komp2, szerokosc_obrazka, wysokosc_obrazka);
  435.             komponent3 = wykonajIDCT(komp3, szerokosc_obrazka, wysokosc_obrazka);
  436.             break;
  437.         }
  438.     }
  439.  
  440.     switch(ByteRun)
  441.     {
  442.     case 1:
  443.         {
  444.             vector<Uint8> temp1(komponent1, komponent1 + szerokosc_obrazka * wysokosc_obrazka);
  445.             vector<Uint8> temp2(komponent2, komponent2 + szerokosc_obrazka * wysokosc_obrazka);
  446.             vector<Uint8> temp3(komponent3, komponent3 + szerokosc_obrazka * wysokosc_obrazka);
  447.  
  448.             vec1 = temp1;
  449.             vec2 = temp2;
  450.             vec3 = temp3;
  451.             break;
  452.         }
  453.     case 2:
  454.         {
  455.             vec1 = ByteRunDekompresja(komponent1, sectionSize1);
  456.             vec2 = ByteRunDekompresja(komponent2, sectionSize2);
  457.             vec3 = ByteRunDekompresja(komponent3, sectionSize3);
  458.             break;
  459.         }
  460.     }
  461.  
  462.     delete[] komponent1;
  463.     delete[] komponent2;
  464.     delete[] komponent3;
  465.  
  466.     komponent1 = new Uint8[vec1.size()];
  467.     komponent2 = new Uint8[vec2.size()];
  468.     komponent3 = new Uint8[vec3.size()];
  469.  
  470.     copy(vec1.begin(), vec1.end(), komponent1);
  471.     copy(vec2.begin(), vec2.end(), komponent2);
  472.     copy(vec3.begin(), vec3.end(), komponent3);
  473.  
  474.     switch(predykcja)
  475.     {
  476.     case 1:
  477.         {
  478.             // brak
  479.             break;
  480.         }
  481.     case 2:
  482.         {
  483.             for(int y = 0; y < wysokosc_obrazka; y++)
  484.             {
  485.                 DefiltratorRoznicowy(komponent1+y * szerokosc_obrazka, szerokosc_obrazka);
  486.                 DefiltratorRoznicowy(komponent2+y * szerokosc_obrazka, szerokosc_obrazka);
  487.                 DefiltratorRoznicowy(komponent3+y * szerokosc_obrazka, szerokosc_obrazka);
  488.             }
  489.             break;
  490.         }
  491.     }
  492.  
  493.     for(int y = 0; y < wysokosc_obrazka; y++)
  494.     {
  495.         for(int x = 0; x < szerokosc_obrazka; x++)
  496.         {
  497.             switch(tryb)
  498.             {
  499.             case 1:
  500.                 {
  501.                     setRGB555(x + szerokosc_obrazka, y, komponent1[y * szerokosc_obrazka + x],
  502.                                  komponent2[y * szerokosc_obrazka + x], komponent3[y * szerokosc_obrazka + x]);
  503.                     break;
  504.                 }
  505.             case 2:
  506.                 {
  507.                     setPixel(x + szerokosc_obrazka, y, komponent1[y * szerokosc_obrazka + x],
  508.                                  komponent2[y * szerokosc_obrazka + x], komponent3[y * szerokosc_obrazka + x]);
  509.                         break;
  510.                 }
  511.             case 3:
  512.                 {
  513.                     YUVtoRGB(x + szerokosc_obrazka, y, komponent1[y * szerokosc_obrazka + x],
  514.                                  komponent2[y * szerokosc_obrazka + x], komponent3[y * szerokosc_obrazka + x]);
  515.                         break;
  516.                 }
  517.             }
  518.         }
  519.     }
  520.     wejscie.close();
  521.     SDL_UpdateWindowSurface(window);
  522.  
  523.     delete[] komponent1;
  524.     delete[] komponent2;
  525.     delete[] komponent3;
  526. }
  527.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement