» 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: 52423
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: 52423
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.242
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
308
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.054
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
180
29.11.2024, 03:29
NoGoodNoodle
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
605
18.04.2011, 09:19
theissi
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
373
12.06.2010, 13:49
Zerberus
Problem ZV
Hallo, ich habe bei meinem EP3 die Battarie ausgebaut und das Auto ist Verriegelt. Da die Kiste jetz kein Saft hat geht die ZV natürlich nicht also wollte ich den Kofferraum aufschließen aber das Schloss ist anscheinend auch Elektrisch. Hab ihn hoch...
von höllenfahrer
20
585
07.03.2013, 16:57
höllenfahrer
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
204
05.03.2012, 17:58
Der-Pate
Problem
Leute wer kann mir vielleicht weiter helfen ? wenn ich mit meinenm Honda PRELUDE in niedrigen drehzal fahre dann zuckt das auto oder wenn ich auf 2 gang rüberschalte und vollgas gebe dauert es ein paar sekunden bis er zieht :( Passiert aber nicht...
von shokboy
5
283
11.12.2009, 20:25
preludevv
Problem mit PBV bei EJ9
Hi Also ich hab ein Problem mit dem PBV von tss. Wo ich es eingebaut habe lief alles einwandfrei bin morgends auch noch ins Geschäft gefahren ca. 20km als ich heim gefahren bin ging die orange Motor Warnleuchte an und die Drehzahl im Leerlauf ging...
von ChefStylist
4
608
13.07.2006, 15:19
EJUSA2
© 2004 - 2025 www.programmierer-forum.de | Communities | Impressum |