Implementasi Metode Punctured Elias Codes Pada Kompresi File Text

  

LAMPIRAN A: LISTING PROGRAM

Main Program

  package skripsi; /**

  • @author REZA
  • / public class Skripsi { /**
  • @param args the command line arguments
  • / public static void main(String[] args) { try { for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { if ("Nimbus".equals(info.getName())) { javax.swing.UIManager.setLookAndFeel(info.getClassName()); break; } } } catch (ClassNotFoundException ex) { java.util.logging.Logger.getLogger(kompresi.class.getName()).log(java .util.logging.Level.SEVERE, null, ex); } catch (InstantiationException ex) {

  java.util.logging.Logger.getLogger(kompresi.class.getName()).log(java .util.logging.Level.SEVERE, null, ex); } catch (IllegalAccessException ex) { java.util.logging.Logger.getLogger(kompresi.class.getName()).log(java .util.logging.Level.SEVERE, null, ex); } catch (javax.swing.UnsupportedLookAndFeelException ex) { java.util.logging.Logger.getLogger(kompresi.class.getName()).log(java .util.logging.Level.SEVERE, null, ex); } java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new home().setVisible(true); } }); } }

  Class Compression

  import java.util.Scanner; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import java.util.Collections; /**

  • @author REZA
  • / public class compression { public static String[] p1(int n){ String x ; String[] result = new String[n]; result[0]= "0"; for(int i=1;i<=n-1;i++){ String flag =""; String code =""; x = Integer.toBinaryString(i); String reverse = new StringBuffer(x).reverse().toString();

  for(int j=0;j<x.length();j++) { if(x.charAt(j)=='1') { flag += "1"; } } flag +="0"; code = flag + reverse ; result[i]= code; } return result; } public static String[] p2(int n){ compression punctured = new compression(); String[] P1 = punctured.p1(n+1); String[] result = new String[n]; String x=""; for(int i=0;i<n;i++){ x = P1[i+1]; String P2 = new StringBuffer(x).deleteCharAt(0).toString(); result[i]=P2; } return result; } @SuppressWarnings("unchecked") public static void countandsortfreqchar(String txt,List karakter,List frekuensi){ int r = 0; int frek = 0 ; for(int i=0;i< txt.length();i++){ frek =0; if(!karakter.contains(txt.charAt(i))){ karakter.add(txt.charAt(i)); frek = 1; frekuensi.add(frek); } else { frek = Integer.parseInt(frekuensi.get(karakter.indexOf(txt.charAt(i))).toStr ing())+ 1; frekuensi.set(karakter.indexOf(txt.charAt(i)), frek); } } for(int i=0;i<frekuensi.size();i++){ r=i; for(int j=i;j<frekuensi.size();j++){ if(Integer.parseInt(frekuensi.get(r).toString()) < Integer.parseInt(frekuensi.get(j).toString())){ r=j; } } Collections.swap(karakter, i, r); Collections.swap(frekuensi, i, r); } } public static String padding(int n){ String pad=""; int pads = 8 - (n%8); for(int i=0;i<pads;i++){ pad +="0"; } return pad; } public static String flagging(int n){ String flag = Integer.toBinaryString(n); while(flag.length()<8){ flag ="0"+flag; } return flag; } public static String Encode(String bitstring){ StringBuffer str = new StringBuffer(); for(int i=0;i<bitstring.length();i+=8){ String s = bitstring.substring(i, i+8);

char c = (char) (Integer.parseInt(s, 2)); str.append(c); } return str.toString(); } public static String Decode(String encodestr){ StringBuffer str = new StringBuffer(); for(int i=0;i<encodestr.length();i++){ char c = encodestr.charAt(i); StringBuffer x = new StringBuffer(Integer.toBinaryString((int)c)); if(x.length()<8){ int y = 8 - (x.length()%8); for(int j=0;j<y;j++){ x.insert(0,"0"); } } str.append(x); } return str.toString(); } }

  Form Compression

  import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.filechooser.FileNameExtensionFilter; import org.apache.poi.extractor.ExtractorFactory; import org.apache.poi.hwpf.extractor.WordExtractor; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.exceptions.OpenXML4JException; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.xmlbeans.XmlException; /**

  • @author REZA
  • / public class kompresi extends javax.swing.JFrame { List karakter = new ArrayList(); List frekuensi = new ArrayList();

  File file; File file1; JFileChooser openfile = new JFileChooser(); JFileChooser savefile = new JFileChooser(); StringBuffer content = new StringBuffer(); String[] code ; String[] paragraph; String pilihkode; String BitStr=""; String ekstfile; int uncompressed_bits; int compressed_bits; Long totaltime; int n=0; /**

  • Creates new form kompresi
  • / public kompresi() { initComponents(); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { //------------ Baca String dari input File txt atau doc------
    • content.delete(0, content.length()); compression punctured = new compression(); openfile.setFileSelectionMode(JFileChooser.FILES_ONLY); openfile.setAcceptAllFileFilterUsed(false); openfile.addChoosableFileFilter(new FileNameExtensionFilter("TXT Document (*.txt)", "txt")); openfile.addChoosableFileFilter(new FileNameExtensionFilter("WORD Document (*.doc)","doc")); openfile.addChoosableFileFilter(new FileNameExtensionFilter("All Files (*.txt,*.doc)","doc", "txt")); int returnVal = openfile.showOpenDialog(this); if (returnVal == openfile.APPROVE_OPTION) { file = openfile.getSelectedFile(); jTextField1.setText(file.getAbsolutePath().toString()); if(jTextField1.getText().toLowerCase().endsWith(".txt")){ BufferedReader bufferedReader = null;

  try { int r; String text = null; bufferedReader = new BufferedReader(new FileReader(jTextField1.getText())); while ((r = bufferedReader.read())!= -1) { char ch =(char)r; content.append(ch); } if (bufferedReader != null) { bufferedReader.close(); } uncompressed_bits = content.toString().length()*8;

  System.out.println("ukuran sebelum kompresi:"+uncompressed_bits +" bit"); } catch (IOException e) { JOptionPane.showMessageDialog(null, "File Tidak Ditemukan!", "Error", JOptionPane.ERROR); } } else if (jTextField1.getText().toLowerCase().endsWith(".doc")){ try{ FileInputStream fis = new FileInputStream(jTextField1.getText()); POIFSFileSystem poi = new POIFSFileSystem(fis); //HWPFDocument document = new HWPFDocument(fis); WordExtractor extractor = (WordExtractor)ExtractorFactory.createExtractor(poi); paragraph = extractor.getParagraphText(); for(int i=0;i<paragraph.length;i++){ String text = paragraph[i]; String text2=text.substring(0, text.length()-1); content.append(text2); } content.deleteCharAt(content.length()-1); uncompressed_bits = (content.toString().length())*8; System.out.print(content.toString()); // content.append(extractor.getText().toString()); }catch(IOException ex) { JOptionPane.showMessageDialog(null, ex.toString(), "Error", JOptionPane.ERROR_MESSAGE); } catch (InvalidFormatException ex) { Logger.getLogger(kompresi.class.getName()).log(Level.SEVERE, null, ex); } catch (OpenXML4JException ex) { Logger.getLogger(kompresi.class.getName()).log(Level.SEVERE, null, ex); } catch (XmlException ex) { Logger.getLogger(kompresi.class.getName()).log(Level.SEVERE, null, ex); } } System.out.println("inputString:\n"+content); System.out.println("panjang input String: "+content.length()+" bit"); // ---------------------------------------------------------

  • } } private void jRadioButton1ActionPerformed(java.awt.event.ActionEvent evt) { jRadioButton2.setSelected(false); pilihkode="P1"; // TODO add your handling code here:

  } private void jRadioButton2ActionPerformed(java.awt.event.ActionEvent evt) { jRadioButton1.setSelected(false); pilihkode="P2"; // TODO add your handling code here: } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { //--------------Menentukan Direktori File Outout-------------

  • savefile.setFileSelectionMode(JFileChooser.FILES_ONLY); savefile.setAcceptAllFileFilterUsed(false); savefile.addChoosableFileFilter(new FileNameExtensionFilter("pec File (*.pec)", "pec")); int returnVal = savefile.showSaveDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { file1 = savefile.getSelectedFile(); jTextField2.setText(file1.getPath()); } //-----------------------------------------------------------
    • } private void jTextField2ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { if(pilihkode==null){ JOptionPane.showMessageDialog(rootPane,"No Punctured Elias Code \n Please Choose One First !!!","Error",JOptionPane.WARNING_MESSAGE); }

  else if(jTextField1.getText().equals("")){ JOptionPane.showMessageDialog(rootPane,"No Input File \n Please Open a File !!!","Error",JOptionPane.WARNING_MESSAGE); } else if(jTextField2.getText().equals("")){ JOptionPane.showMessageDialog(rootPane,"Please Set Directory For Output File !!!","Error",JOptionPane.WARNING_MESSAGE); } else{ // Date starttime =null, endtime = null; Long starttime = System.currentTimeMillis(); //===Proses Kompresi========================================================= compression punctured = new compression(); //---Baca Karakter dan Frekuensi pada String Input-----------

  punctured.countandsortfreqchar(content.toString(),karakter,frekuensi) ; n= karakter.size(); //-----------------------------------------------------------

  • //Membuat Tabel Kode Punctured Elias Codes berdasarkan jumlah karakter-- if(pilihkode=="P1"){ code = punctured.p1(n); } else if(pilihkode=="P2"){ code = punctured.p2(n); } //------------------------------------------------------------
    • //-------Membuat bit string berdasarkan tabel kode-------------
      • for(int i=0;i<content.toString().length();i++){ BitStr += code[karakter.indexOf(content.toString().charAt(i))]; } //-------------------------------------------------------------
        • //Penambahan PADDING dan Flag----------------------------------
        • String pad= punctured.padding(BitStr.length()); String flag = punctured.flagging(pad.length()); BitStr += pad+flag; //-------------------------------------------------------------
        • //-------Encoding BitString------------------ String WriteStr = punctured.Encode(BitStr); //------------------------------------------- //=================================================================== ======

  System.out.println("\n bitstring:\n"+BitStr); System.out.println("Panjang Bit String Sebelum Encode "+BitStr.length()+" bit"); System.out.println("panjang bit string Setelah encode "+WriteStr.length()+" Byte"); //-------Menulis File Hasil Kompresi------------------------ if(jTextField1.getText().toLowerCase().endsWith(".txt")){ ekstfile =".txt.pec"; } else if(jTextField1.getText().toLowerCase().endsWith(".doc")){ ekstfile =".doc.pec"; } File compressedfile = new File(file1.getAbsolutePath().toString()+ekstfile); try (FileWriter fw = new FileWriter(compressedfile)) { System.out.print(fw.getEncoding()); //------------Menulis File Hasil Kompresi-------------------

  • fw.write(WriteStr); fw.flush(); fw.close(); //----------------------------------------------------------

  //-----------Menulis Header File----------------------------

  • FileOutputStream fos = new FileOutputStream(file1.getAbsoluteFile().toString()+".header"); ObjectOutputStream oos = new ObjectOutputStream(fos); oos.writeObject(karakter); oos.writeObject(code); oos.close(); //----------------------------------------------------------
  • Long endtime = System.currentTimeMillis(); totaltime = endtime - starttime; } catch (IOException ex) { JOptionPane.showMessageDialog(null, ex.toString(), "Error", JOptionPane.ERROR); }

  compressed_bits = BitStr.length(); System.out.print("compressed size="+compressed_bits+" bit"); //---------------------------------------------------------- //--------------Menghitung Rasio Kompresi------------------- double RC = (double)uncompressed_bits/compressed_bits; double CR = (double)compressed_bits/uncompressed_bits *100; double RD = (double)100-CR; //---------------------------------------------------------- //--------Menampilkan Ratio Hasil Kompresi------------------ jTextArea1.append("----------------------------------------------

  • \n"
    • "Punctured Elias Code("+pilihkode+")\n"
    • "------------------------------------------
      • \n"

    • "|String|: "+content.toString().length()+"\n"
    • "|Char|: "+n+"\n"
    • "Uncompressed bits: "+uncompressed_bits+" bit\n"
    • "Compressed bits : "+compressed_bits+" bit\n\n"
    • "Ratio of Compression (RC): "+RC+"\n"
    • "Compression Ratio (CR): "+CR+" %\n"
    • "Redundancy (RD): "+RD+"%\n"
    • "Compression Time: "+totaltime+" ms\n"
    • "------------------------------------------
      • \n\n\n"); content.delete(0, content.length()); BitStr= ""; pilihkode=null; jRadioButton1.setSelected(false); jRadioButton2.setSelected(false); jTextField1.setText(null); jTextField2.setText(null); totaltime=null; //----------------------------------------------------------- JOptionPane.showMessageDialog(rootPane, "File Compressed Successfully...", "Compression", JOptionPane.INFORMATION_MESSAGE); } }

  private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) { jTextArea1.setText(""); // TODO add your handling code here: }

  Form Decompression

  import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.ObjectInputStream; import java.util.ArrayList; import java.util.List; import java.util.logging.Level; import java.util.logging.Logger; import javax.swing.JFileChooser; import javax.swing.JOptionPane; import javax.swing.filechooser.FileNameExtensionFilter; import org.apache.poi.extractor.ExtractorFactory; import org.apache.poi.hwpf.HWPFDocument; import org.apache.poi.hwpf.extractor.WordExtractor; import org.apache.poi.hwpf.usermodel.Range; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.apache.poi.openxml4j.exceptions.OpenXML4JException; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.xmlbeans.XmlException; /**

  • @author REZA
  • / public class dekompresi extends javax.swing.JFrame { JFileChooser openfile = new JFileChooser(); JFileChooser openfile1 = new JFileChooser(); JFileChooser savefile = new JFileChooser(); File file; File file1;

  File file2; StringBuffer content = new StringBuffer(); StringBuffer content1 = new StringBuffer(); int text_bits; int uncompressed_bits; List karakter = new ArrayList(); List frekuensi = new ArrayList(); String[] code; String[] paragraph; String BitStr; Long starttime,endtime; /**

  • Creates new form dekompresi
  • / public dekompresi() { initComponents(); } private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { //-----------------Baca File Input Hasil Kompresi------------
    • content.delete(0, content.length()); content1.delete(0, content1.length()); compression punctured = new compression(); openfile.setFileSelectionMode(JFileChooser.FILES_ONLY); openfile.setAcceptAllFileFilterUsed(false); openfile.addChoosableFileFilter(new FileNameExtensionFilter("pec File (*.pec)", "pec")); int returnVal = openfile.showOpenDialog(this); if (returnVal == openfile.APPROVE_OPTION) { file = openfile.getSelectedFile(); jTextField1.setText(file.getAbsolutePath().toString()); BufferedReader bufferedReader = null; try { int r; String text = null; bufferedReader = new BufferedReader(new FileReader(jTextField1.getText()));

  while ((r = bufferedReader.read())!= -1) { char ch =(char)r; content.append(ch); } if (bufferedReader != null) { bufferedReader.close(); } } catch (IOException e) { JOptionPane.showMessageDialog(null, "File Tidak Ditemukan!", "Error", JOptionPane.ERROR); } System.out.println("InputString:\n"+content); System.out.println("Panjang inputString:\n"+content.toString().length()); System.out.println("bitStr:\n"+punctured.Decode(content.toString())); //----------------------------------------------------------

  • String namafile = jTextField1.getText().toLowerCase(); if(namafile.substring(namafile.length()-8, namafile.length()- 4).equals(".txt")){ BufferedReader bufferedReader1 = null; try { int r; String text = null; bufferedReader1 = new BufferedReader(new FileReader("C:\\Users\\REZA\\Desktop\\FileTeks\\"+file.getName().subs

  tring(0, file.getName().length()-4)));

  while ((r = bufferedReader1.read())!= -1) { char ch =(char)r; content1.append(ch); } if (bufferedReader1 != null) { bufferedReader1.close(); } text_bits = content1.toString().length()*8; System.out.println(text_bits); } catch (IOException e) { JOptionPane.showMessageDialog(null, "File Tidak Ditemukan!", "Error", JOptionPane.ERROR); } } else if (namafile.substring(namafile.length()-8, namafile.length()-4).equals(".doc")){ try{ FileInputStream fis = new FileInputStream("C:\\Users\\REZA\\Desktop\\FileTeks\\"+file.getName() .substring(0, file.getName().length()-4)); POIFSFileSystem poi = new POIFSFileSystem(fis); //HWPFDocument document = new HWPFDocument(fis); WordExtractor extractor = (WordExtractor)ExtractorFactory.createExtractor(poi); paragraph = extractor.getParagraphText(); for(int i=0;i<paragraph.length;i++){ String text = paragraph[i]; String text2 = text.substring(0,text.length()-1); content1.append(text2); } content1.deleteCharAt(content1.length()-1); text_bits = content1.toString().length()*8; System.out.print(text_bits); // content.append(extractor.getText().toString()); }catch(IOException ex) { JOptionPane.showMessageDialog(null, ex.toString(), "Error", JOptionPane.ERROR_MESSAGE); } catch (InvalidFormatException ex) { Logger.getLogger(kompresi.class.getName()).log(Level.SEVERE, null, ex); } catch (OpenXML4JException ex) { Logger.getLogger(kompresi.class.getName()).log(Level.SEVERE, null, ex); } catch (XmlException ex) { Logger.getLogger(kompresi.class.getName()).log(Level.SEVERE, null, ex); } } } } @SuppressWarnings("unchecked") private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) { //----------------------Baca File Header --------------------

  openfile1.setFileSelectionMode(JFileChooser.FILES_ONLY); openfile1.setAcceptAllFileFilterUsed(false); openfile1.addChoosableFileFilter(new FileNameExtensionFilter("Header File (*.header)", "header")); int returnVal = openfile1.showOpenDialog(this); if (returnVal == openfile1.APPROVE_OPTION) { file2 = openfile1.getSelectedFile(); jTextField3.setText(file2.getAbsolutePath().toString()); try { FileInputStream fos = new FileInputStream(jTextField3.getText()); ObjectInputStream oos = new ObjectInputStream(fos); karakter= (List<String>) oos.readObject(); code = (String[]) oos.readObject(); oos.close(); // System.out.println("inputString:\n"+content.toString()); //System.out.println("PanjangString:\n"+content.toString().length()); } catch(Exception e){} System.out.println(code.length); for(int i=0;i<code.length;i++){ System.out.println(code[i]+"\t"+karakter.get(i)); } // ---------------------------------------------------------

  • } } private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) { //---------Menentukan Direktori File Output------------------
    • savefile.setFileSelectionMode(JFileChooser.FILES_ONLY); savefile.setAcceptAllFileFilterUsed(false); savefile.addChoosableFileFilter(new FileNameExtensionFilter("TEXT Document", "txt")); savefile.addChoosableFileFilter(new FileNameExtensionFilter("WORD Document" ,"doc")); int returnVal = savefile.showSaveDialog(this); if (returnVal == JFileChooser.APPROVE_OPTION) { file1 = savefile.getSelectedFile(); jTextField2.setText(file1.getPath()); } //-----------------------------------------------------------
    • } private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) { if(jTextField1.getText().equals("")){

  JOptionPane.showMessageDialog(rootPane,"No Input File *.pec \n Please Open a File !!!","Error",JOptionPane.WARNING_MESSAGE); }else if(jTextField2.getText().equals("")){ JOptionPane.showMessageDialog(rootPane,"Please Set Directory For Output File !!!","Error",JOptionPane.WARNING_MESSAGE); }else if(jTextField3.getText().equals("")) { JOptionPane.showMessageDialog(rootPane,"No Input File

  • .header \n Please Open a File !!!","Error",JOptionPane.WARNING_MESSAGE); } else{ starttime = System.currentTimeMillis(); //======================Proses Dekompresi=============================== compression punctured = new compression(); //Proses Decoding--------------------------------------------
    • BitStr = punctured.Decode(content.toString()); //-----------------------------------------------------------
    • //-----Menentukan Batas index akhir dalam pembacaan BitString-------- String flag = BitStr.substring(BitStr.length()-8, BitStr.length()); int jlhflag = Integer.parseInt(flag, 2); int n =BitStr.length()-(jlhflag+8); //-----------------------------------------------------------
    • //----Mengubah BitString menjadi Karakter semula-------------
    • String compressedcode=""; String UncompressedStr=""; for(int i=0;i<n;i++){ compressedcode += BitStr.charAt(i); for(int j=0;j<code.length;j++){ if(compressedcode.equals(code[j])){ UncompressedStr += karakter.get(j).toString(); compressedcode=""; } }

  } //-----------------------------------------------------------

  • //=================================================================== === String namafile = jTextField1.getText().toLowerCase(); //-------------Menulis Hasil File Dekompresi ke txt atau doc-
    • if(namafile.substring(namafile.length()-8, namafile.length()- 4).equals(".txt")){

  File newTextFile = new File(file1.getAbsolutePath().toString()+".txt"); try (FileWriter fw = new FileWriter(newTextFile)) { fw.write(UncompressedStr); fw.flush(); fw.close(); endtime = System.currentTimeMillis(); } catch (IOException ex) { JOptionPane.showMessageDialog(null, ex.toString(), "Error", JOptionPane.ERROR); } } else if(namafile.substring(namafile.length()-8, namafile.length()-4).equals(".doc")){ try{ InputStream systemResource = ClassLoader.getSystemResourceAsStream("skripsi/template.doc"); POIFSFileSystem poi = new POIFSFileSystem(systemResource); HWPFDocument doc = new HWPFDocument(poi); Range range = doc.getRange(); StringBuilder bucket = new StringBuilder(); bucket.append(UncompressedStr); range.insertBefore(bucket.toString()); bucket = null; FileOutputStream fos = new FileOutputStream(file1.getAbsolutePath().toString()+".doc"); doc.write(fos); fos.close(); fos=null; endtime = System.currentTimeMillis(); }catch(IOException ex){ JOptionPane.showMessageDialog(null, ex.toString(), "Error", JOptionPane.ERROR); } } //--------------------------------------------------------------

  • uncompressed_bits = UncompressedStr.length()*8; double completeness = (double)uncompressed_bits/(double)text_bits * 100; Long totaltime = endtime- starttime; jTextArea1.append("----------------------------------------- \n"
    • "Decompression Time: "+totaltime+" ms\n"
    • "Completeness: "+completeness+" %\n"
    • "----------------------------------------- \n\n"); starttime=null; endtime=null; totaltime=null; JOptionPane.showMessageDialog(rootPane, "File Decompressed Successfully...", "Compression", JOptionPane.INFORMATION_MESSAGE); System.out.println("uncompressedString:\n"+UncompressedStr);

  System.out.print(namafile.substring(namafile.length()-8, namafile.length()-4)); } } private void jTextField1ActionPerformed(java.awt.event.ActionEvent evt) { // TODO add your handling code here: } private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) { jTextArea1.setText(""); // TODO add your handling code here: }

  Hasil Kompresi Dengan Panjang Character Set 237 Karakter File PEC Hasil Kompresi

  File Header Hasil Kompresi