» 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: 52431
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: 52431
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.414
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
333
27.02.2015, 13:51
O.K.R.C.
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
513
29.11.2024, 03:29
NoGoodNoodle
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.096
26.05.2005, 09:30
Hondagirl
problem mit tft
hallo hab da nen prob mit meinem tft habe ein Jvc KD-dv 5101 und einen no name tft und bekomme kein "filmbild" wenn ich ne musik dvd drin habe zeigt mir der tft alle alben usw an aber sobald ich ne filmdvd einlege steht auf dem monitor das...
von nobbla
4
532
23.02.2007, 11:19
nobbla
ABS Problem 4.4
He Leute... Also ich ahb mal ein bis zwei Fragen... Ich hab das Problem das meine ABS Lampe leutet sobald ich eine gewisse geschwindigkeit erreiche... Durch das ausblinken hab ich mitbekommen, das das der Radsensor hinten rechts ist... Das seltsame ist...
von Sandmann2610
7
451
11.05.2015, 10:02
Blues
EJ2 problem
Grüßt euch habe ein böses problem mit meinem ej2. bin am sonntag von bekannten heim gefahren ( ne nette strecke von ca 600 km autobahn). nach nem kurzen rasthof besuch bin ich zurück auf die autobahn und linke spur und auf 150 beschleunigt....
von CrizzleEJ2
22
635
14.11.2010, 16:05
hondacoupeusa
Em1 zv Problem
Hallo, habe die original Honda zv mit Fernbedienung ( mit 2 tasten) mein Problem ist nun das ich nicht mehr abschließen kann mir der Fernbedienung aber die kleine rote LED leuchtet beim drücken es passiert aber nichts Aufschließen ist kein Problem. Habe...
von yasuni69
3
213
29.05.2014, 20:24
Civic-Vtec
EJ2 Problem
Hallo Mein EJ2 springt nicht mehr an es gibt keinen Zündfunken was ist da kaputt...
von mostwanted
4
698
26.03.2007, 11:18
mostwanted
Hab ein Problem.
Ich hab die Ps3 Slim 120G. Ich habe Internet ich kann auch mit der PS3 ins Internet. Doch wenn ich mich anmelden will um Online zu spielen braucht es sehr lange dann kommt Zeitablauf bei der Verbindung zum Playstation@Network . Kann mir bitte jemand...
von Zhegranii10
3
242
11.03.2010, 17:53
Moaschi
© 2004 - 2025 www.programmierer-forum.de | Communities | Impressum |