» 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.327
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
321
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
261
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.079
26.05.2005, 09:30
Hondagirl
Problem mit dem Sub.
Hab vor krurzem meine Anlage eingebaut.. alles verkabelt etc... Funktioniert. nun aber wenn ich bissl unterwegs bin.. kommt auf einmal nix mehr aus der kiste. lautsprecher vorn alles i.o. endstufe leuchtet weiter grün.. nun öffne ich fahrer oder...
von Mikey
9
159
03.09.2014, 08:06
flx
del sol problem
hey hab ein problem und zwar das ab und zu der motor kurzzeitig aussetzt ein paar mal hintereinander und dan leuchtet die motorkontroll Leuchte. das passiert so im schnitt 2 -3 mal im Monat. wenn ich ihn dann abstelle und ihn neu starte ist meistens...
von Stuzi
4
228
17.01.2010, 10:34
westkingsize
dvd problem auf ps2
hi leute ich wollte auf meiner ps2 gebrannte filme im dvd format gucken nach einigen versuchen ein und auschalten lief dan der film aber so das er ganze zeit 2sekunden laueft und dann steht das bild fuer ca.5sekunden chip ist eingebaut spiele...
von damire25
1
219
22.01.2010, 18:34
mgutt
Problem mit der LWR
Moin, Moin! Ich habe ein Problem: und zwar muss ich meine frontleuchten für den tüv wieder in den alten zustand zurückbauen. Da ich den Umbau damals ohne Ahnung vollkommen chaotisch gemacht habe, weiß ich jetzt nicht mehr, wie ich zu dem...
von potter
3
188
17.01.2012, 23:16
sunnytn
PC problem
Hab da ein kleines Problem mit mein Rechner seit 2 tagen wenn ich im vom netz nehme und wieder hochfahren will erkennt er keine FP mehr habe schon mehrfach das BIOS resettet neue Kabel nix hat geholfen. Aber nach einer halben Stunde rumprobieren...
von sense08
8
638
22.09.2007, 10:11
sense08
PCV Problem
Hi, wie oben erwähnt wollte ich fragen ob mir jemand sagen kann wie ich beim ED9 das PCV anschließen muss (kurbelwellenentlüftung). Ich hab gemerkt das ich nen offenen schlauch habe und dieser ordentlich unterdruck erzeugt, also geh ich davon aus das...
von InPaniC
3
431
10.12.2011, 21:59
InPaniC
© 2004 - 2025 www.programmierer-forum.de | Communities | Impressum |