Frage von Pogel, 115

Binärcode in Bild konvertieren?

Gibt es Möglichkeiten, eine binäre Zahlenfolge (wie 10010101) in ein monochromes schwarz-weiß Bild umzuwandeln?

Antwort
von eddiefox, 80

Hallo,

das sollte gehen. Man müsste ein Programm schreiben, dass die binäre Zahlenfolge (z.B. 10010101...) in die schwarz-weiß Information eines spezifischen Dateiformats umwandelt.

Dabei muss ein Dateiheader für ein Dateiformat (jpg, gif, png, bmp ...) erzeugt werden und die Nullen und Einsen in die Pixel des Bildes eingetragen werden. Man muss sich überlegen, wie man die Bild-Dimension anlegt (Pixel-Breite, Pixel-Höhe) und fehlene Pixel entweder mit weiß oder schwarz ergänzen.

Dabeii würde sich das gif oder png-Format mit schwarz-weiß Palette anbieten.

Expertenantwort
von hypergerd, Community-Experte für Mathematik, 38

Nicht 1 sondern unendlich viele Algorithmen sind denkbar!

Nehmen wir Pi im Binärformat:

=11.00100100001111110110101010001000100001011010001100001000110100110001001100011001100010100010111000000011011100000111001101....

Unter 

http://www.lamprechts.de/gerd/Pi_Nachkommastellen_Bilder_visualisiert.html

findet man zig mögliche Algorithmen! Natürlich kann jedes dieser Bilder nachträglich in Schwarz-Weiß oder Graustufen konvertiert werden...

Was genau ist Dein Ziel? Oder suchst Du nur den primitivste aller Wege?

Dann schau Dir  "Weitere 13 Nullen ab 3186699200000 " das Bild an.

Einfach ein gleichgroßes SW-Bild im BMP-Format (unkomprimiert) nehmen und die Bytes austauschen (ohne Header zu verändern).

Antwort
von triopasi, 76

Ja, das geht, musst nur entscheiden ob 1 schwarz oder weiss sein soll und welches format das Bild haben soll (quadratisch/...). Und programmieren solltest du können.. Sprache?

Kommentar von Pogel ,

Bin gerade ein Neuling im Programmieren. PHP wäre für mich am gelegensten, aber da möchte ich mal nicht wählerisch sein.

Die 1 soll schwarz sein und das gewünschte Format ist 359x5299.

Ich habe bereits versucht mit Photoshop ein bmp zu batchen, hat aber nicht geklappt.

Kommentar von kingbongo ,

Das was du vor hast (aus 0 und 1 ein Schwarz Weiss Bild zu erstellen) ist relativ einfach. Mal das Beispiel anschauen:

php.net/manual/en/function.imagesetpixel.php

Kommentar von Pogel ,

Ich habs versucht, aber meine Programmierfähigkeiten sind da dann doch ein wenig eingeschränkt. Wie definiere ich die Koordinaten, die schwarz sein sollen?

Kommentar von kingbongo ,

Lern erst mal die Basics: Variablen, Schleifen, Bedingungen usw... danach weißt du wie du die Koordinaten setzen kannst. Selbstgelernt, statt vorgekaut, ist immer noch am besten.

Kommentar von Pogel ,

Habe mal versucht etwas für ein Beispiel zu schreiben, komme aber nicht mehr weiter. Könntest du meine Programmierkünste kritisieren/bewerten?

$code = "1111100110011111"

$x = "4"
$y = "4"

$bild = imagecreatetruecolor($x, $y)

for( $i = 0, $i < 16, $i++){
if($code[$i] == 1) {
$color = imagecolorallocate($bild, 0,0,0)
imagesetpixel( $bild, $i % 4, floor($i / 4),  $color)
}
}

Kommentar von fluffiknuffi2 ,

Du hast einen String mit den Nullen und Einsen, den durchläufst du bpsw. mit einer for-Schleife. Außerdem hast du eine Variable x und eine Variable y, beide zunächst mit 0. Und dann zählst du x bei jeder Iteration 1 hoch bis es gleich der gewünschten Bildbreite ist. Ist das der Fall setzt du es auf 0 und erhöhst y um eins. Nun malst du mit dem Grafikbefehl deiner Wahl einen Pixel in das Bild an Position x / y und sagst halt einfach:
if ($NullenUndEinsen[$i] == 1) $farbe = 'black'; else $farbe = 'white';

Oder so ähnlich jenachdem was dein Pixelmalbefehl als Farbwerte akzeptiert. Vielleicht auch Hex-Werte, dann halt '#000000' bzw '#FFFFFF'.

Antwort
von 3v1lH4x0R, 35

Dies ist durchaus möglich, da dies auch der Weg ist wie normale Bilder gespeichert werden.
Du könntest natürlich ein bereits bestehendes Bildformat nehmen, jedoch empfehle ich dir bei schwarz-weiss Bildern ein eigenes festzulegen.
Wichtige Informationen die im Header (Daten am Anfang der Datei) festgelegt werden müssten wären sowohl Breite als auch Höhe des Bildes.
Danach können einfach die Bytes die das Bild ausmachen folgen. Hierfür würde ich ein Bit pro Pixel verwenden, wobei eine 1 für Schwarz und eine 0 für Weiss steht.

Ich hoffe ich konnte helfen und falls du Probleme bei der Implementierung hast frag gerne nach.

Kommentar von Tobihogh ,

mit einem Bit kannst du keine Grautöne darstellen. Er möchte glaub monochromes Schwarz Weiß.

Antwort
von Tobihogh, 30

Du legst dir ein paar bytes fest welche für Bildinformationen bestimmt sind (Breite, Höhe...) dann brauchst du pro Pixel 2 Bytes einer gibt an wie groß der Schwarzanteil ist der Andere den Weißanteil. Schon hast du einen neuen Datentyp. Das musst du dann nur noch in einem Programm zurückrechnen und es darstellen.

Antwort
von Pogel, 15

Ich habe es endlich geschafft, eine funktionierende PHP zu schreiben.

Ich danke Euch allen vielmals!

Für Interessierte:

<?php
$code = "";
$breite = "359";
$hoehe = "5299";

$bild = imagecreatetruecolor($breite, $hoehe);

for( $i = 0; $i < $breite*$hoehe; $i++ ){
if($code[$i] == 1) {
$schwarz = imagecolorallocate($bild, 0, 0, 0);
$x = $i % $breite;
$y = floor($i / $breite);
imagesetpixel( $bild, $x, $y, $schwarz);
}
if($code[$i] == 0){
$weiss = imagecolorallocate($bild, 255, 255, 255);
$wx = $i % $breite;
$wy = floor($i / $breite);
imagesetpixel( $bild, $wx, $wy, $weiss);
}
};
header('Content-Type: image/png');
imagepng($bild);
?>

Kommentar von hypergerd ,

siehe Optimierung bei meinem Kommentar -> for mit 1 Zeile

Expertenantwort
von hypergerd, Community-Experte für Mathematik, 19

Ich habe gerade die andere Frage beantwortet und vermutlich meinst Du das SELBE SETI...

Da reicht ein Texteditor und die richtige Formatierung:

http://www.lamprechts.de/Bilder/SETI8_16.png

und verkleinert besser als Bild zu erkennen:

lamprechts.de/Bilder/SETI8_256klein.png

Kommentar von Pogel ,

Erstaunlicherweise war genau dies meine Intention, jedoch wollte ich die Gelegenheit nutzen, um nebenbei ein bisschen PHP zu lernen.

Vielen Dank!

Kommentar von hypergerd ,

Hallo Pogel, Dein Code ist noch umständlich:

a) die Farbe muss nicht zig mal Speicher beanspruchen (also raus aus Schleife)

b) statt mehrere if -> besser mit Array:

$breite = intval(359);$hoehe = intval(754);
$bh=$breite*$hoehe;
$bild = imagecreatetruecolor($breite, $hoehe);
$farbe[0] = imagecolorallocate($bild, 255, 255, 255);
$farbe[1] = imagecolorallocate($bild, 0, 0, 0);
for( $i = intval(0); $i < $bh; $i++ ) imagesetpixel( $bild, $i % $breite, (int)($i/$breite), $farbe[intval($code[$i])]);

http://www.lamprechts.de/gerd/php/PlotPNG.php

Antwort
von Roderic, 44
Kommentar von fluffiknuffi2 ,

Naja ich habe tatsächlich mal in C ein Programm geschrieben das BMPs ausgelesen hat... es ist kein Hexenwerk, aber trivial ist es auch nicht und in Anbetracht der Art wie die Frage gestellt wurde war (schon bevor es bestätigt wurde) klar, dass hier ein Anfänger am Werk ist. Denke der ist damit dann doch eher überfordert. :p

Keine passende Antwort gefunden?

Fragen Sie die Community