» 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: 52436
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: 52436
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.961
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
471
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
901
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.214
26.05.2005, 09:30
Hondagirl
Problem mit D16 im ED6
Hey Leute:) Hab gestern nen D16 DOHC in meinen ED6 geswappt.. Nun hab ich folgendes Problem: Der Wagen springt an, aber der Drehzahlbegrenzer kommt bei 3500U/min.Und wenn ich das Gaspedal voll durchdrücke nimmt er kein Gas an, bei 3/4 Gaspedalstellung...
von Domicrx1988
4
309
12.01.2013, 18:33
Domicrx1988
24h-Uhr-Problem
ich hab mal neulich hier gefunden, wie man im Accord mit Navi die Uhr auf 24h-Format umstellen kann. So weit so cool, ausprobiert. Das war gestern nachmittag da hab ich mich dann gewundert, denn es sah ganz so aus als hätte meine...
von the_eye
6
1.967
19.07.2009, 06:22
Andy-cl9
EG 8 Problem...
Hab seit kurzem ein Problem mit meinem EG8. Beim gas geben und loslassen 1-3 gang ruckelt er und zieht nicht sofort. Kann eigentlich nur die einspritzung oder luft sein oder?...
von RafaPL87
5
2.111
23.10.2006, 18:56
RafaPL87
Problem mit dem Öl - EH6
Hey, habe folgendes Problem: An den vorderen 3 Schrauben die den Ventildeckel am Zylinderkopf befestigen tritt einiges an Öl aus. Ab welcher Drehzahl genau keine Ahnung aber bis 3500 rpm nichts. Weder die Bolzen noch die Metallteller die die...
von Korkmaaz
4
260
12.06.2011, 10:02
Korkmaaz
problem mit bb9
hallo,bin neu hier und habe ein problem.mein prelude ist jetzt schon 2mal einfach ausgegangen.erst gesten bei 150kmh auf der ab und 3.spur.war sehr erchreckend. problem ist,beim zündung anmachen flattert manchmal meine instrumentenbeleuchtung und...
von hondastuff
8
998
22.01.2008, 20:38
hondastuff
v tec problem
Hey freunde der sonne 8) Und zwar hab ich folgendes problem hab z6 kopf auf d13 block verbaut soweit so gut schnurrt auch wie ne Kätzchen nur ist das problem termostat öffnet nicht und v tec springt nicht rein?? Und drehzahl und Geschwindigkeitsanzeige...
von 921
2
288
14.12.2013, 16:49
921
© 2004 - 2026 www.programmierer-forum.de | Communities | Impressum |