2016-07-21 18 views
0

Ich habe viel über Datenkomprimierung und die damit verbundene Mathematik nachgedacht. Die Idee kam mir, dass es einfacher sein könnte, das binäre Äquivalent der Datei in Hex zu schreiben, um QR-Codes zu speichern, die als PNG-Dateityp komprimiert und dann zum Extrahieren umgekehrt werden. Ich habe die Idee von all den Leuten bekommen, die Screenshots von Textnachrichten mit mehr als 160 Zeichen machen und als Tweeres posten, um längere Tweets zu senden.Datenkomprimierung mit Bildern als Code-Speichermedium

Meine Mathe geht wie folgt und meine Frage ist, wo ist der Fehler in meiner Annahme.

177 x 177 QR-Code kann 4.296 alphanumerische Zeichen speichern. PNG QR Codes sind ungefähr 870 Bytes. Ich habe 2 Tests mit PDF-Dateien durchgeführt und festgestellt, dass eine 158 KB große PDF-Datei eine binäre Zeichenfolge von 321.562 Zeichen hat, wenn sie in Hex umgewandelt wurde. Das entspricht 75 QR-Codes, die 65kb benötigen. Als ich Windows10 eingebautes Komprimierungstool verwendete, komprimierte es 157kb.

Ich stelle mir vor mit OCR könnten Sie den Hex-Code direkt in ein PNG schreiben und dann zurück lesen, die direkter und effizienter wäre. Wo liegt der Fehler in dieser Logik für ein Mittel der Datenkompression?

EDIT Ich habe einen Code zusammengestellt, um ein Bild, PNG-Datei, mit der Hex-Darstellung in ihm zu erstellen. Es ist schwer zu sagen, ob alle Charaktere tatsächlich vertreten sind. Wenn ich das Bild öffne, zeigt es nur einen Teil der Zeichen und ich weiß nicht, wie man das Hex als verpackten Text schreibt.

public class TextToGraphics { 

public static void main(String[] args) { 
    StringBuilder sb = new StringBuilder(); 
    try { 
     BufferedInputStream is = new BufferedInputStream(new FileInputStream("C:\\file.pdf")); 
     try { 
      for (int b; (b = is.read()) != -1;) { 
       String s = Integer.toHexString(b).toUpperCase(); 
       if (s.length() == 1) { 
        sb.append('0'); 
       } 
       //sb.append(s).append(' '); 
       sb.append(s); 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }  
    } 
    catch (FileNotFoundException e1) { 
     // TODO Auto-generated catch block 
     e1.printStackTrace(); 
    }   

    System.out.println(sb); 

    try { 
     int width = 20000, height = 40; 

     // TYPE_INT_ARGB specifies the image format: 8-bit RGBA packed 
     // into integer pixels 
     BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB); 

     Graphics2D ig2 = bi.createGraphics(); 

     Font font = new Font("TimesRoman", Font.BOLD, 10); 
     ig2.setFont(font); 
     String message = sb.toString(); 
     FontMetrics fontMetrics = ig2.getFontMetrics(); 
     int stringWidth = fontMetrics.stringWidth(message); 
     int stringHeight = fontMetrics.getAscent(); 
     ig2.setPaint(Color.black); 
     ig2.drawString(message, (width - stringWidth)/2, height/2 + stringHeight/4); 

     ImageIO.write(bi, "PNG", new File("C:\\image.png")); 

     } catch (IOException ie) { 
     ie.printStackTrace(); 
     } 

}

nicht sicher, wo ich schief gelaufen ist, aber bisher sieht es aus wie mein 350kb PDF zu einem 21kb PNG komprimiert wird, aber nicht sicher, ob ich alle Zeichen aus lesen kann wieder zu dekomprimieren.

Antwort

2

Kurzfassung:

PNG und andere Bildkompressionsalgorithmen sind so konzipiert, Bilder enthalten 2D-Muster zu komprimieren, sind etwas Binärdateien unwahrscheinlich, wenn es als Bild und als Ergebnis wäre unwahrscheinlich codiert enthalten mit geeigneteren konkurrieren Kompressionstechniken.

Lange Version:

Datenkompression Arbeiten von Vorteil der erwarteten Muster in den Daten unter komprimiert werden. Zum Beispiel wird die Textkomprimierung in der Regel die Vorteile von wiederholten Zeichenläufen wie wiederholten Instanzen von "the" und "a" nutzen. Die Bildkomprimierung (z. B. PNG) beruht normalerweise auf der Annahme, dass Pixel nahe beieinander in der Farbe ähnlich sind.

Wenn eine Datei wenige oder keine Muster enthält, die von einem bestimmten Komprimierungsalgorithmus ausgenutzt werden können, wird die Datei kaum komprimiert oder könnte sogar größer werden. Schauen Sie sich zum Beispiel Random Pixels an.

Dies ist eine 200x200 PNG-Datei mit zufälligen farbigen Pixeln. Da es keine Muster im Bild sind, können sie nicht, und als Ergebnis komprimiert werden, ist die Datei als PNG größer als durch die gezeigte folgende:

Raw pixel data size: 200 * 200 * 3(bytes per pixel) = 120 000 bytes 

PNG size:   120 304 bytes (304 bytes LARGER) 

QR-Codes typischerweise Textströme wie URLS werden verwendet, um zu codieren, das sind stark gemustert und und wird daher ziemlich gut komprimieren, sogar mit einem Algorithmus, der entwickelt wurde, um Bilder zu komprimieren.

Binärdateien können absolut alles enthalten. Wenn sie als Bilddatei dargestellt werden, wird wahrscheinlich ein Bild mit sehr wenigen 2D-Mustern erzeugt, ähnlich wie das obige Bild mit dem farbigen Rauschen.Wenn konfrontiert mit einer Datei komprimiert die Inhalte ist effektiv unbekannt gute Ansätze sind:

Huffman-Kodierung:

Eine Technik, die den Vorteil einer ungleichmäßigen Verteilung von Werten in die Datei, zB die Buchstaben ‚e‘ mehr zu sein braucht häufiger als jede andere in Englisch Text.

Lauflängencodierung:

Eine Technik, die wiederholt, zum Beispiel der viele Vorkommen von „the“ in diesem Beitrag zu seinem Vorteil von Sequenzen von Zeichen erfolgt.

+0

Danke für die schnelle Rückmeldung. Ich suche zu verstehen, ob ein Bild des binären Codes wesentlich kleiner als die ursprüngliche Datei selbst wäre. QR-Codes scheinen eine bequeme und bewährte Möglichkeit zu sein, den Binärcode in einem Bild zu erfassen und wieder zu lesen. Ich suche zu verstehen, ob dies eine fehlerhafte Logik ist oder ob es tatsächlich als effektiver/effizienter Komprimierungsalgorithmus funktionieren würde. – Jordan

+0

Ein unkomprimiertes Bild einer Binärdatei ist immer größer als die Binärdatei selbst, da es genau die gleichen Daten enthält wie die Binärdatei, die in einem Pixelfeld gespeichert ist, mit dem zusätzlichen Overhead der Header-Daten der Bilddateien. Das Komprimieren des Bildes unter Verwendung von PNG oder einer anderen Bildkompressionstechnik könnte möglicherweise die Datei kleiner machen, aber das Komprimierungsverhältnis ist wahrscheinlich niedrig im Vergleich zu geeigneteren Techniken, wie oben beschrieben. –

+0

Wenn Sie eigene Experimente machen möchten, könnte ich Ihnen ein einfaches Programm schreiben, das eine Datei in ein PNG-Bild konvertiert. –