Advertisement
Guest User

Untitled

a guest
Feb 18th, 2020
131
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 12.08 KB | None | 0 0
  1. /*
  2.  * harkkatyö
  3.  * lausekielinen ohjelmointi 2
  4.  *
  5.  * Ohjelma lataa kuvan tiedostosta taulukkoon, jota käyttäjä voi käskyjen mukaan muokata.
  6.  *
  7.  */
  8. import java.io.*;
  9. import java.util.Scanner;
  10. public class BimEdit{
  11.    
  12.     //luokkavakiot ohjelmalle
  13.     public static final String LOPETA = "quit";
  14.     public static final String TULOSTA = "print";
  15.     public static final String INFO = "info";
  16.     public static final String INVERT = "invert";
  17.     public static final String DILAATIO = "dilate";
  18.     public static final String ERODE = "erode";
  19.     public static final String LATAUS = "load";
  20.    
  21.     public static final Scanner lukija = new Scanner(System.in);
  22.     public static void main(String[] args) {
  23.     //pääohjelma tarkistaa komentoriviparametrit ja komennon ja kutsuu komennonsuoritusmetodia
  24.        
  25.         //alkunäytön tulostus
  26.         tervehdys();
  27.  
  28.         //tarkistetaan onko annettu komentoriviparametri oikea sekä kutsutaan komennonkysyjä-metodia
  29.         if(args.length == 1 || (args.length == 2 && args[1].equals("echo"))) {
  30.            
  31.             //parametrin ensimmäinen osa on tiedoston nimi
  32.             String tiedostonNimi = args[0];
  33.            
  34.             //apumuuttuja, johon lisätään tausta- ja edustavärit
  35.             char[] merkit = new char[2];
  36.            
  37.             //ladataan tiedostosta kuva taulukkoon
  38.             char[][] kuva = lataaKuvaTaulukkoon(tiedostonNimi, merkit);
  39.            
  40.             //jos kuva ei ole tyhjä, niin tarkistetaan onko komento kaksiosainen vai yksiosainen.
  41.             if (kuva != null) {
  42.                 boolean jatketaan = true;
  43.                 while (jatketaan) {  
  44.                     System.out.println("print/info/invert/dilate/erode/load/quit?");
  45.                     //luetaan syöte käyttäjältä
  46.                     String komento = lukija.nextLine();
  47.                    
  48.                     //Jos komentoriviparametreissa on annettu käsky "echo", tulostetaan se syöttämisen jälkeen näytölle
  49.                     if (args.length == 2 && args[1].equals("echo")) {
  50.                         System.out.println(komento);
  51.                     }    
  52.                     else if (komento.equals(LOPETA)) {
  53.                         jatketaan = false;
  54.                     }                
  55.                    
  56.                     //Suoritetaan valittu komento
  57.                     // tarkastetaan dilate ja erode käskyistä, että ne sisältävät numeron
  58.                     else if (komento.split(" ")[0].equals("dilate") && komento.split(" ").length == 2) {
  59.                        
  60.                         String[] komennonOsat = komento.split(" ");
  61.                         int syote = Integer.parseInt(komennonOsat[1]);
  62.                         char etuMerkki = merkit[1];
  63.                         kuva = dilateJaErode(kuva, syote, etuMerkki);
  64.                     }
  65.                    
  66.                     else if (komento.split(" ")[0].equals(ERODE) && komento.split(" ").length == 2) {
  67.                         String[] komennonOsat = komento.split(" ");
  68.                         int syote2 = Integer.parseInt(komennonOsat[1]);
  69.                         char takaMerkki = merkit[0];
  70.                         kuva = dilateJaErode(kuva, syote2, takaMerkki);
  71.                     }
  72.                     else if (komento.equals(TULOSTA)) {
  73.                         kuvanTulostus(kuva);  
  74.                     }
  75.                     else if (komento.equals(INFO)) {
  76.                         infous(kuva, merkit);
  77.                     }
  78.                     else if (komento.equals(INVERT)) {
  79.                         kuva = inverttaus(kuva, merkit);
  80.                     }                                      
  81.                     else if (komento.equals(LATAUS
  82.                    
  83.                     )) {
  84.                         kuva = lataaKuvaTaulukkoon(tiedostonNimi, merkit);
  85.                     }
  86.                     else {
  87.                         System.out.println("Invalid command!");
  88.                     }
  89.                 }
  90.             }
  91.             //jos kuva on tyhjä
  92.             else {
  93.                 System.out.println("Invalid image file!");
  94.                 System.out.println("Bye, see you soon.");
  95.             }
  96.         }
  97.          //jos komentoriviparametrit ovat virheelliset
  98.         else {
  99.             System.out.println("Invalid command-line argument!");
  100.             System.out.println("Bye, see you soon.");
  101.  
  102.         }  
  103.     }
  104.     // PRINT-syötteen METODI
  105.     public static void kuvanTulostus(char[][] kuva) {
  106.         if (kuva != null) {
  107.              // Käydään läpi rivi kerrallaan
  108.             for (int rivi = 0; rivi < kuva.length; rivi++) {
  109.                 // Käydään sarakkeet läpi.
  110.                 for (int sarake = 0; sarake < kuva[0].length; sarake++) {
  111.                    //tulostetaan taulukko
  112.                    System.out.print(kuva[rivi][sarake]);
  113.                 }
  114.                 // Rivin lopussa vaihdetaan riviä.
  115.                 System.out.println();
  116.             }
  117.         }
  118.     }
  119.            
  120.     //METODI info syötteelle
  121.     public static void infous(char[][] kuva, char[] merkit) {
  122.        
  123.         //tehdään tarvittavat muuttujat
  124.         int riviLkm = kuva.length;
  125.         int sarakeLkm = kuva[0].length;
  126.         char taustaMerkki = merkit[0];
  127.         char etuMerkki = merkit[1];
  128.         int eMerkkiLkm = 0;
  129.         int tMerkkiLkm = 0;
  130.        
  131.         //käydään rivit läpi
  132.         for (int rivi = 0; rivi < kuva.length; rivi++) {
  133.             // Käydään sarakkeet läpi.
  134.             for (int sarake = 0; sarake < kuva[rivi].length; sarake++) {
  135.                
  136.                 //lasketaan edusta- ja taustamerkkien lukumäärä
  137.                 if (kuva[rivi][sarake] == taustaMerkki){
  138.                     tMerkkiLkm++;
  139.                 }
  140.                 else if (kuva[rivi][sarake] == etuMerkki) {
  141.                     eMerkkiLkm++;
  142.                 }
  143.             }
  144.         }
  145.         //tulostetaan kuvan info
  146.         System.out.println(riviLkm + " x " + sarakeLkm);
  147.         System.out.println(taustaMerkki + " " + tMerkkiLkm);
  148.         System.out.println(etuMerkki + " " + eMerkkiLkm);
  149.     }
  150.            
  151.     //METODI INVERT-SYÖTTEELLE
  152.     public static char[][]inverttaus(char[][] kuva, char[]merkit) {
  153.         char a = merkit[0];
  154.         char b = merkit[1];
  155.         //tämä vaihtaa merkit a:sta b:hen
  156.         if (kuva != null && kuva.length > 0 && kuva[0].length > 0) {
  157.             // Käydään läpi kaikki taulukon alkiot kaksinkertaisen silmukan avulla.
  158.             int rivilkm = kuva.length;
  159.             for (int rivi = 0; rivi < rivilkm; rivi++) {
  160.                 for (int sarake = 0; sarake < kuva[rivi].length; sarake++) {
  161.                     // Vaihdetaan merkki a merkiksi b.
  162.                     if (kuva[rivi][sarake] == a) {
  163.                         kuva[rivi][sarake] = b;
  164.                     }
  165.                     // Vaihdetaan merkki b merkiksi a.
  166.                     else if (kuva[rivi][sarake] == b) {
  167.                       kuva[rivi][sarake] = a;
  168.                     }
  169.                 }
  170.             }
  171.         return kuva;
  172.         }
  173.        
  174.     return null;
  175.     }
  176.    
  177.  
  178.     //METODI DILATE- ja ERODE käskyille, suurentaa ja pienentää kuvaa
  179.     public static char[][] dilateJaErode(char[][] kuva, int syote, char merkki) {
  180.         if (kuva != null && kuva.length > 0 && kuva[0].length > 0) {
  181.             int riviLkm = kuva.length;
  182.             int sarakeLkm = kuva[0].length;
  183.            
  184.             char[][] uusiKuva = new char[riviLkm][sarakeLkm];
  185.  
  186.             //kopioidaan kuva uudeksi kuvaksi
  187.             for (int rivi = 0; rivi < riviLkm; rivi++) {
  188.                 for (int sarake = 0; sarake < sarakeLkm; sarake++) {
  189.                    uusiKuva[rivi][sarake] = kuva[rivi][sarake];
  190.                 }
  191.             }        
  192.            
  193.            
  194.             //syöte = käyttäjän komennon perässä oleva luku,
  195.             //joka kertoo kuvan koon, määritellään pääohjelmassa            
  196.             if (syote < 3 || syote % 2 == 0) {
  197.                 System.out.println("Invalid command.");
  198.             }
  199.             else {
  200.                 //r = taulukon reunat, jotka eivät ole "ikkunan" keskikohdassa koskaan
  201.                 int r = (syote - 1) / 2;
  202.                
  203.                 //käydään läpi taulukkoa, jätetään r kokoiset reunat käymättä
  204.                 for (int rivi = r; rivi < kuva.length - r; rivi++) {
  205.                     for (int sarake = r; sarake < kuva[rivi].length - r; sarake++){
  206.                         for (int x = rivi - r; x < rivi + r + 1; x++) {
  207.                             for (int y = sarake - r; y < sarake + r + 1; y++) {
  208.                            
  209.                                 if (kuva[x][y] == merkki) {
  210.                                     uusiKuva[rivi][sarake] = merkki;
  211.                                 }
  212.                             }
  213.                         }
  214.                     }
  215.                 }
  216.             return uusiKuva;
  217.             }
  218.         }
  219.         return null;
  220.     }
  221.    
  222.    
  223.    
  224.     //ALKUNÄYTÖN TULOSTUS METODI tervehdys
  225.     public static void tervehdys() {
  226.  
  227.         System.out.println("-----------------------");
  228.         System.out.println("| Binary image editor |");
  229.         System.out.println("-----------------------");
  230.        
  231.     }
  232.    
  233.     //KUVAN LATAUSMETODI
  234.     public static char[][] lataaKuvaTaulukkoon(String tiedostonNimi, char[] merkit) {
  235.         Scanner tiedostonLukija = null;
  236.        
  237.         //varaudutaan poikkeukseen ja yritetään lukea tiedostoa
  238.         try {
  239.             //luodaan tiedosto-olio
  240.             if (merkit.length == 2 && merkit != null && tiedostonNimi != null) {
  241.                 File tiedosto = new File(tiedostonNimi);
  242.                 //liitetään lukija tiedostoon
  243.                 tiedostonLukija = new Scanner(tiedosto);
  244.                
  245.              
  246.                 //luodaan muuttujat tiedon keräykselle tiedoston alusta 4 riviä.
  247.                 int riviLkm = Integer.parseInt(tiedostonLukija.nextLine());
  248.                 int sarakeLkm = Integer.parseInt(tiedostonLukija.nextLine());
  249.                 char merkki1 = tiedostonLukija.nextLine().charAt(0);
  250.                 char merkki2 = tiedostonLukija.nextLine().charAt(0);
  251.                
  252.                 //kuvan tausta ja edustamerkit
  253.                 merkki1 = merkit[0];
  254.                 merkki2 = merkit[1];
  255.                 //tarkistetaan että koot ovat sopivat
  256.                 if (riviLkm < 3 || sarakeLkm < 3 ) {
  257.                     return null;
  258.                 }
  259.                 else {
  260.                     char[][] kuva = new char[riviLkm][sarakeLkm];
  261.                    
  262.                     while (tiedostonLukija.hasNextLine()) {
  263.                         for(int rivi = 0; rivi < riviLkm; rivi++ ) {
  264.                             String rivit = tiedostonLukija.nextLine();
  265.                             if(rivit.length() == sarakeLkm) {
  266.                                 for (int sarake = 0; sarake < sarakeLkm; sarake++) {
  267.                                     char merkki = rivit.charAt(sarake);
  268.                                     if(merkki == merkki1 || merkki == merkki2) {
  269.                                         kuva[rivi][sarake] = merkki;
  270.                                     }
  271.                                     else {
  272.                                         return null;
  273.                                     }
  274.                                 }
  275.                             }
  276.                             else {
  277.                                 return null;
  278.                             }
  279.                         }
  280.                     }
  281.                    
  282.                 //suljetaan lukija
  283.                 tiedostonLukija.close();
  284.                     return kuva;
  285.                 }
  286.             }
  287.         }
  288.         //siepataan poikkeus, tai jos kuva on tyhjä
  289.         catch (Exception e){
  290.             if (tiedostonLukija != null) {
  291.                 tiedostonLukija.close();
  292.             }
  293.             return null;
  294.         }
  295.     //palautetaan ladattu kuva
  296.     return null;
  297.     }
  298. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement