Foto-Datei in Binärcode umwandeln?

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.


DerPengi 
Beitragsersteller
 17.08.2021, 16:52

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?

daCypher  18.08.2021, 09:07
@DerPengi

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

Von einem Experten bestätigt

Spikeman197  17.08.2021, 01:03

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...