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.
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
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. –
Wenn Sie eigene Experimente machen möchten, könnte ich Ihnen ein einfaches Programm schreiben, das eine Datei in ein PNG-Bild konvertiert. –