Foto-Datei in Binärcode umwandeln?
Moin. Wie kann ich ein Foto in Binärcode anzeigen lassen. Im Rechner ist es ja so gespeichert nur wie kann ich dies einsehen? Ich möchte keine hexadezimale Anzeige etc. sondern nur das Bild aus 0-en und 1-en. Kann man den Binärcode danach auch wieder als Bild anzeigen lassen?
3 Antworten
Es gibt zwar jede Menge Hex-Editoren, mit denen du dir ein Bild als Hex-Werte anschauen kannst, aber soweit ich weiß keinen Editor, mit dem du es dir in Binär, also nur mit Nullen und Einsen anschauen kannst.
Ich hab dir mal ein kleines Java-Programm gebastelt:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
public class BinaryView {
public static void main(String[] args) throws IOException {
// Bild auswählen
JFileChooser fileChooser = new JFileChooser();
if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
// Ausgabedatei auswählen
fileChooser.setSelectedFile(new File(file.getAbsolutePath() + ".binary.txt"));
if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
FileInputStream inputStream = new FileInputStream(file);
BufferedWriter writer = new BufferedWriter(new FileWriter(fileChooser.getSelectedFile()));
// Nullen und Einsen schreiben
for (byte b:inputStream.readAllBytes()) {
writer.append(String.format("%8s", Integer.toBinaryString(b)).replace(' ', '0'));
}
// Alles schließen
inputStream.close();
writer.close();
JOptionPane.showMessageDialog(null, "Fertig.");
}
}
}
}
Wenn du es startest, fragt es dich nach einer Datei. Da kannst du dann einfach die Datei auswählen, die du haben willst. Als nächstes fragt es dich nach dem Speicherort für die Datei mit Nullen und Einsen. Da kannst du einfach das nehmen, was schon drinsteht. Wenn du auf ok klickst, wird die Datei erstellt und du kannst sie dir anschauen.
Denk dran, dass die Ausgabedatei acht mal so groß wird, wie die Quelldatei. Das ist schnell zu viel für den normalen Windows-Editor.
Ja, das wäre im Prinzip einfach der umgedrehte Weg. Beachte aber, dass das Programm einfach die Rohdaten ausliest und in Binärdarstellung abspeichert. Wenn du den umgedrehten Weg machst, musst du also den Bitmap-Header im Binärformat vor die Datei schreiben, damit Windows etwas mit den Daten anfangen kann.
package de.daCypher.exercises;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
public class BinaryToFile {
public static void main(String[] args) throws IOException {
// Datei auswählen
JFileChooser fileChooser = new JFileChooser();
if (fileChooser.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
File file = fileChooser.getSelectedFile();
// Ausgabedatei auswählen
fileChooser.setSelectedFile(new File(file.getAbsolutePath() + ".bmp"));
if (fileChooser.showSaveDialog(null) == JFileChooser.APPROVE_OPTION) {
FileInputStream inputStream = new FileInputStream(file);
FileOutputStream outputStream = new FileOutputStream(fileChooser.getSelectedFile());
// Bytes schreiben
String input = new String(inputStream.readAllBytes());
input.replaceAll("[^01]", "");
Matcher matcher = Pattern.compile(".{8}").matcher(input);
Byte[] bytes = matcher.results().map(result->Byte.valueOf((byte) (Integer.parseInt(result.group(), 2) & 0xff))).toArray(Byte[]::new);
byte[] output = new byte[bytes.length];
for (int i = 0; i<bytes.length; ++i) output[i] = bytes[i];
outputStream.write(output);
// Alles schließen
inputStream.close();
outputStream.close();
JOptionPane.showMessageDialog(null, "Fertig.");
}
}
}
}
Ich hab übrigens im Code von gestern noch einen Fehler gefunden: Die Zeile mit "writer.append..." musst du durch das ersetzen:
writer.append(String.format("%8s", Integer.toBinaryString(Byte.toUnsignedInt(b))).replace(' ', '0'));
Sonst werden die Bytes aus der Ursprungsdatei als negative ints interpretiert, wenn sie größer als 127 sind. Dadurch kriegen die dann 24 führende Einsen, die nicht da sein sollten.
Wie Anzeigen: So wie jede andere Datei auch -. it einem Editor, der das anzeigen kann
Wieder als Bild anzeigen: Klar: Anschauen verändert die datei ja nicht
Bitteschön: https://www.dcode.fr/binary-image
hmm, mMn ist die Seite für reine schwarz-weiß Bilder, sogar ohne Graustufen...
sowas hat man vor 20 Jahren bei HandyLogos auf 1 Bit MatrixDisplays benötigt...
Wow, vielen Dank. Ich werde es gleich nach der Arbeit mal ausprobieren. Kann man den Binärcode auch durch ein geschriebenes Programm wieder in eine Bilddatei umwandeln? Also quasi 24Bit pro Pixel?