» problem mit imagesetpixel

Benchmark: mysql, mysqli - Buffer, Cache und Prepared StmtNeuen Thread eröffnenNeue Antwort erstellenBenchmark: $gentime vs. filemtime (Filecache)
AutorNachricht
Beobachter 
Anmeldedatum: 11.10.2009
Beiträge: 2
11.10.2009, 20:42
zitieren

Hallo liebe Forum-User,

ich habe leider ein problem mit der Funktion imagesetpixel. In meinem Code würde ich gere einen Binär-String in ein Bild umwandeln. Das mache ich momentan mit folgendem code:

//$b ist der binär code
$a = str_split($b);
$z = strlen($b);
//seitenlänge des bildes bestimmen:
$x = round(sqrt($z));
//bild erzeugen <-- bis hirhin functioniert auch noch alles ohne probleme
$im = ImageCreate ($x,$x);
for($c=1; $c<=$x; $c++){
       for($y = 1; $y<=$x; $y++){
              // position im array bestimmen:
               $d = $c*$y;
               switch($a[$d]){
                       case '0':
                               if(imagesetpixel($im, $x, $y, ImageColorAllocate ($im, 0, 0,
0))===FALSE){die('FAIL');}
                       break;
                       case '1':
                               if(imagesetpixel($im, $x, $y, ImageColorAllocate ($im, 255, 255,
255))===FALSE){die('FAIL');}
                       break;
               }
       }
}

Das Problem ist, dass momentan das gesammte bild schwarz gefärbt wird... Ich hoffe ihr seht den Fehler und könnt mir helfen.


mfg
FRED


pn
Administrator 

Name: Marc
Geschlecht:
Anmeldedatum: 28.08.2004
Beiträge: 52435
Wohnort: Lohmar


Meine eBay-Auktionen:
11.10.2009, 21:38
zitieren

Hi,

mein Lösungsvorschlag soweit:
<?php

if (isset($_GET['debug'])) {
define('DEBUG', 1); // um die meldungen, statt das bild auszugeben
}

// binärdaten
// funktioniert, da 9 stellen = wurzel 3 ist, ohne runden zu müssen
$b = '100000100';
// funktioniert nur bedingt, da gerundet werden muss (mögliche lösung im switch)
$b = '1111101111111110000000000010101010100100000000000001000001000000000000000000000111111111111111111101001001010100000000000000000';

if (defined('DEBUG')) {
echo('Binär: ' . $b . '<br />');
}

// länge von binär
$l = strlen($b);

// wurzel = seitenlänge
$sqrt = sqrt($l);

// seitenlänge gerundet (aufrunden, wir wollen ja keine werte verlieren)
$max_x = $max_y = ceil($sqrt);

if (defined('DEBUG')) {
echo('Bildgröße: ' . $max_x . 'x' . $max_y . ' (Wurzel war ' . $sqrt . ' aus ' . $l . ')<br />');
}

// bild erzeugen
$im = imagecreate($max_x, $max_y);

// farben erzeugen (aus performancegründen außerhalb der schleife / on-the-fly geht nicht)
// erste farbe füllt automatisch das generierte bild
$white = imagecolorallocate ($im, 255, 255, 255);
$black = imagecolorallocate ($im, 0, 0, 0);

// zähler für die position in binär
$p = 0;

// zählen beginnt immer bei 0, d.h. 1x1 ist in wirklichkeit 0x0
for($y = 0; $y < $max_y; $y++) {
for($x = 0; $x < $max_x; $x++) {
if (defined('DEBUG')) {
echo(($x+1) . 'x' . ($y+1) . ' Position in Binär: ' . $p);
}
switch($b{$p}){
case '0':
imagesetpixel($im, $x, $y, $white);
if (defined('DEBUG')) {
echo(' weiß (0)');
}
break;
case '1':
imagesetpixel($im, $x, $y, $black);
if (defined('DEBUG')) {
echo(' schwarz (1)');
}
break;
default:
// auf grund der rundungsfehler könnte man hier den rest weiß füllen lassen
imagesetpixel($im, $x, $y, $white);
if (defined('DEBUG')) {
echo(' weiß (kein Wert)');
}
}
if (defined('DEBUG')) {
echo('<br />');
}
// position hochzählen
$p++;
}
}

if (!defined('DEBUG')) {
// bild ausgeben
header('Content-Type: image/png');
imagepng($im);
}
// speicher freigeben
imagedestroy($im);

?>

Wie Du siehst, musst Du Dir Gedanken darüber machen, was Du machst, wenn Du keine Daten mehr hast. Also ob der Rest weiß werden soll oder wie auch immer.

Die x und y Schleifen habe ich gedreht, da ich davon ausgehe, dass Du in der 1. Zeile von links nach rechts durchlaufen willst und dann in die 2. Zeile gehen willst. In Deiner Variante wärst Du spaltenweise durchgegangen.

str_split brauchst Du nicht, da man mit {} auf die Position eines Strings zugreifen kann. Ruf das script z.b. als test.php auf und Du siehst das Bild. Ruf es mit test.php?debug, um die verschiedenen echo-Ausgaben sehen zu können.

Gruß


pn email
Beobachter 
Anmeldedatum: 11.10.2009
Beiträge: 2
11.10.2009, 22:14
zitieren

hi danke für die schnelle antwort :)
funktioniert auch wie gewollt, nur leider geht das mit dem decoden noch nicht... hier der code beider functionen, vllt wird dann alles übersichtliger:

function imgtov($co, $u){
for($x=0;$x<=$u;$x++){
$co = base64_decode($co);
}
$im = 'uit/'.$_SESSION['login']['pw'].$_SESSION['login']['hash'].'.jpg';
file_put_contents($im, $co);
$ima = imagecreatefromjpeg($im);
$ims = getimagesize($im);
$iw = $ims[0];
$ih = $ims[1];
for($x = 1; $x < $iw; $x++){
for($y = 1; $y < $ih; $y++){
$ot = imagecolorat($ima, $x, $y);
$rgb = imagecolorsforindex($ima,$ot);
if($rgb['red']!='0'){
$out .= '0';
} else {
$out .= '1';
}
}
}
unlink($im);
return $out;
}

function vtoimg($b){
$l = strlen($b);
$sqrt = sqrt($l);
$max_x = $max_y = ceil($sqrt);
$im = imagecreate($max_x, $max_y);
$white = imagecolorallocate ($im, 255, 255, 255);
$black = imagecolorallocate ($im, 0, 0, 0);
$p = 0;
for($y = 0; $y < $max_y; $y++) {
   for($x = 0; $x < $max_x; $x++) {
  switch($b{$p}){
case '0':
imagesetpixel($im, $x, $y, $white);
break;

case '1':
imagesetpixel($im, $x, $y, $black);
break;

default:
imagesetpixel($im, $x, $y, $white);
break;
  }
  $p++;
   }
}
$d = new date;
$now = $d->now('timestamp');
$fname = 'cit/'.$now.$_SESSION['login']['hash'].'.jpg';
  fclose(fopen($fname, 'a'));
imagejpeg($im,$fname);
$co = file_get_contents($fname);
$rd = rand(1,9);
for($x=0; $x<=$rd; $x++){
$co = base64_encode($co);
}
unlink($fname);
return $co.'__::__'.$rd;
}


bei der ersten funktin kommt als return leider nix raus

hoffe auf weiterhin schnelle hilfe :)
mfg
FRED


pn
Administrator 

Name: Marc
Geschlecht:
Anmeldedatum: 28.08.2004
Beiträge: 52435
Wohnort: Lohmar


Meine eBay-Auktionen:
11.10.2009, 22:52
zitieren

spontan sehe ich schonmal, dass du die schleifen wieder gedreht hast. und du beginnst bei 1x1 pixel. richtig wäre 0x0, da php wie gesagt bei 0 mit zählen anfängt. dann hast du keine lösung für die aufgefüllten ungültigen weißen pixel (default). wenn du das bild wieder umkehrst, führt das ja zu einem fehlerhaften binary, weil es länger ist als das original.

da solltest du lieber hingehen und die unnützen bildpunkte mit einer dritten farbe auffüllen und beim einlesen diese dritte farbe ignorieren. damit es nicht so auffällt, könntest du ja ein 1 punkt geringeres schwarz oder weiß nehmen.

ansonsten lass dir doch einfach erstmal das bild ausgeben:
$ima = imagecreatefromjpeg($im);

ob das überhaupt funktioniert. ich vermute, dass die funktion nichts zurückgibt, weil das bild einfach nicht da ist und deswegen gibts auch keine größe und dann läuft auch keine schleife.


pn email
Gast 
11.10.2009, 22:52
zitieren

Mach mit!

Wenn Dir die Beiträge zum Thread "problem mit imagesetpixel" gefallen haben oder Du noch Fragen hast oder Ergänzungen machen möchtest, solltest Du Dich gleich bei uns anmelden:



Registrierte Mitglieder genießen die folgenden Vorteile:
✔ kostenlose Mitgliedschaft
keine Werbung
✔ direkter Austausch mit Gleichgesinnten
✔ neue Fragen stellen oder Diskussionen starten
✔ schnelle Hilfe bei Problemen
✔ Bilder und Videos hochladen
✔ und vieles mehr...


Neuen Thread eröffnenNeue Antwort erstellen
Ähnliche BeiträgeRe:
Letzter Beitrag
Problem nach ASB-swap ** Problem geklärt vielen Dank für eure Ideen !!!!! :) **
Problem nach ASB-swap :yes: Hallo Jungs, ich brauche dringend eure Hilfe :) Ich habe bei meinem EJ9, Bj 1999 einen ASB Swap mit Z6 ASB gemacht. Problem: Motor ging aus und startet nicht mehr Mods: D14: Drosselklappe ink. aller Sensoren, Einspritzdüsen,...
von Ingo01
60
3.714
07.08.2013, 12:06
Blues
Civic ED7 Kupplungs problem / antriebs problem.
habe von einer alten frau einen civic ed7 aus erster hand bj.89 mit nur 86.000km. er stand ca. 10 monate. soo das problem ist nun wenn ich fahre und nicht wie ein rentner gas gebe rutscht die kupplung! ein bekannter sagte dass die kupplung womöglich...
von coasterkev
2
432
27.02.2015, 13:51
O.K.R.C.
Problem Fensterheber/Dichtungs problem
Hi mein Fensterheber auf der Fahrerseite macht Probs..ich mach die Scheibe runter alles im lot..ich mach die Scheibe hoch....die Scheibe geht aus der Dichtung und schiebt sich nach außen...Fenster schließt nicht:(....habt ihr nen...
von Hondagirl
4
1.170
26.05.2005, 09:30
Hondagirl
CR-V RD1 Temperatur Problem / Problem gefunden
Hallo! Ich hoffe ich finde hier jemanden der weiter weiß. Wir wissen es nämlich nicht mehr :no: lol Was ist los? Die Temperatur Anzeige meines CR-V spinnt rum. Sie geht hoch bis kurz vor Ende. So schnell wie sie steigt, sinkt sie aber auch. Anfangs ist...
von NoGoodNoodle
3
821
29.11.2024, 03:29
NoGoodNoodle
4WS Problem
Hi, ich ein Problem mit meiner 4WS Lenkung. Ich habe zwar die Suche benutzt aber nicht die Symptome gefunden die mein Prelude hat. Folgendes tritt auf: Ich starte den Prelude. Die 4WS Lampe geht kurz an und dann wieder aus. Soweit ist das ja...
von twonky
13
2.506
10.01.2007, 12:42
Preludegreen
ej9 ABS PROBLEM
Ich hab mein Radio gestern unten in die mittelkonsole eingebaut. Also hab ich alle Kabel schön sachte nach unten gezogen, alles angeschlossen und wieder zusammen gebastelt. Mein Problem ist jetzt, dass seitdem meine handbremsen leuchte und die abs...
von derAlexxx
7
1.212
02.05.2012, 09:37
derAlexxx
CRX ed9 Problem
sersn, so hab mir heute ein ed9 gekauft!!* freu* So das Problem ist das der Fahrzeugschein fehlt.?! Also Fahrzeugbrief ist schon dabei. ( Wagen ist abgemeldet ) Meine Frage: ist es normal das kein Fahrzeugschein dabei ist ? Danke...
von LUDEkiller
3
474
01.09.2007, 18:10
LUDEkiller
EJ9 Problem
hy habe ein problem mit meinem EJ9 Baujahr 2000 Facelift ich hab heute die Batterie abgehängt für ne halbe Stunde und jetzt spielt er mit der Drehzahl geht ziemlich runter geht aber nicht aus !! ist das normal und wird das wieder von alleine mit der...
von BlackHondaDevil
7
236
05.03.2012, 17:58
Der-Pate
ABS Problem
Servus zusammen! Hab momentan ein sehr merkwürdiges ABS Problem. Und zwar funktioniert mein ABS! Und zwar so gut, dass es ständig anspricht, sobald ich mein Bremspedal etwas mehr als "sehr sanft" betätige. Völlig egal, ob ich gerade mit...
von Zerberus
3
412
12.06.2010, 13:49
Zerberus
Problem, AU
Hi Leute, Es handelt sich um einen Civic Coupe EJ2, Bj.:1995, km:210000, Hubraum: 1,5 liter Folgendes Problem. War beim TÜV, HU/AU HU ohne Problem AU nicht bestanden, da zu hohen CO-Wert. CO-Wert im Leerlauf und bei erhöhter Drehzahl ca.0,6 -...
von theissi
11
690
18.04.2011, 09:19
theissi
© 2004 - 2026 www.programmierer-forum.de | Communities | Impressum |