Zu Hülf! Problem mit PHP GetImageSize()

Benutzeravatar
Charlymarx
Beiträge: 51
Registriert: Mo 21. Feb 2022, 20:04

Zu Hülf! Problem mit PHP GetImageSize()

#1

Beitrag von Charlymarx »

Beim Versuch mit einer einzelnen .jpg Datei funktioniert die Funktion prima und gibt mir Breite und Höhe eines Bildes in einem Array neben anderen Informationen zurück wie z.B. mit einem zweiten Parameter auch die IPTC-Informationen, die dann nur noch geparst werden müssen.

Wenn ich aber, weil ich das für mehrere Bilder benötige vorher das Inhaltsverzeichnis eines ganzen Ordners auslese und da nur die .jpgs in einen Array übernehme, funktioniert die Funktion GetImageSize() nicht mehr. Sie bringt mir keine Informationen mehr zurück, auch nicht, wenn aus dem Inhaltsverzeichnis eine einzelner Dateiname herausgelöst wird und diesen der Funktion übergebe. -> Keine Fehlermeldung und kein Ergebnis. Sobald ich aber die Ermittlung des Inhaltsverzeichnis auskommentiere und nur eine Datei aus diesen Ordner der Funktion übergebe funktioniert es wieder.

Desgleichen mit exif_read_data() - bei einer Einzeldatei funktioniert es. Mit vorheriger Abfrage des Inhaltsverzeichnisses werden keine exif-Informationen mehr geliefert. Wie oben.

Woran kann es liegen? Ich weiß mir nicht mehr zu helfen.
Benutzeravatar
Atarimaster
Beiträge: 3158
Registriert: So 6. Feb 2022, 22:09
Wohnort: Ruhrgebiet

#2

Beitrag von Atarimaster »

So etwas mache ich auch regelmäßig und es funktioniert immer, daher gehe ich davon aus, dass da irgendein Fehler im Code ist. Was mir auf Anhieb als mögliche Fehlerquelle einfällt: Wenn du das Array mit den JPG-Dateien durchläufst, übergibst du bei getimagesize() auch wirklich den Pfad zu den Dateien und nicht nur den Dateinamen?

Dass du keine Fehlermeldung erhältst, könnte auch unzureichend gesetzten Werten von display_errors und error_reporting liegen. Ich glaube, per Default sind da Werte gesetzt, die eben keine Meldungen an den Browser übergeben (genau weiß ich es nicht, weil ich an meiner lokalen PHP-Installation schon sehr viel an der php.ini rumgeschraubt habe und nicht mehr weiß, was da ursprünglich mal drin stand).
Ich habe keine Ahnung, aber davon jede Menge.
Benutzeravatar
Charlymarx
Beiträge: 51
Registriert: Mo 21. Feb 2022, 20:04

#3

Beitrag von Charlymarx »

Danke Atarimaster
Ja, ich habe den ganzen Pfad mit Dateiname übergeben.
Das Erstaunliche ist ja, dass sobald die Erfassung des Inhaltsverzeichnisses auskommtentiert wurde, funktioniert sowohl GetImageSize() auch mit IPTC-Parameter als auch exif_read_data() so wie es soll - komplett alles. Sobald aber vorher das Inhaltsverzeichnis des Ordners abgerufen wird, kommt keine Information mehr durch. Das ist es, was mich so irritiert.
Das Inhaltsverzeichnis wird ja auch völlig störungsfrei bei den Vorschaubildern eingesetzt, lediglich bei den Bildern selbst, wo ich diese Informationen für die Formatfüllende Darstellung brauche - klappt es nicht.
Der Syntaxcheck ist ohne Befund und der Abruf des Inhaltsverzeichnisses ist von der Vorschau kopiert.
Es ist schon sehr verstörend aber ich schaue mir mal die PHPinfo an und vielleicht kann man an der PHP.ini was schrauben, was etwas Licht ins Dunkel bringt. Danke für den Tipp.
Ich habe ja zum Testen auch MAMP am Start, da kann ich schrauben so viel ich will. Aber es ist am Server beim Hoster und lokal das gleiche Ergebnis - verrückt.
Benutzeravatar
Atarimaster
Beiträge: 3158
Registriert: So 6. Feb 2022, 22:09
Wohnort: Ruhrgebiet

#4

Beitrag von Atarimaster »

Sehr seltsam.
Eine Frage noch:
Charlymarx hat geschrieben: So 4. Dez 2022, 16:59 der Abruf des Inhaltsverzeichnisses ist von der Vorschau kopiert.
Hast du in dem Script, in dem das Problem auftaucht, auch überprüft, ob das Inhaltsverzeichnis wirklich ausgelesen wird? Also etwa durch:

Code: Alles auswählen

print_r($array);
… wobei $array natürlich das mit den Dateinamen ist.
Ein gesetztes, aber leeres Array würde bei einem Syntaxcheck ja auch nicht angemeckert werden, daher komme ich auf diese Idee.

Ich wäre auch bereit, mir den Quellcode mal anzugucken; sofern sich der fehlerhafte Teil isolieren lässt – ich also keine Kaskade von 10 PHP-Dateien durchwühlen muss ;) –, aber heute schaffe ich das nicht mehr…
Ich habe keine Ahnung, aber davon jede Menge.
Benutzeravatar
Atarimaster
Beiträge: 3158
Registriert: So 6. Feb 2022, 22:09
Wohnort: Ruhrgebiet

#5

Beitrag von Atarimaster »

So, eins habe ich doch noch geschafft.
Hier mal eine aufs Nötigste eingedampfte Version meines Scripts, die bei mir definitiv läuft. Du kannst das ja mal in eine eigene Datei kopieren und auf deinem System testen – wenn die bei dir auch nicht läuft, musst du u.U. tatsächlich mal in der php.ini graben.
(Nicht übersehen, vorher die Zeile mit $dirToScan = entsprechend anzupassen!)

Ansonsten vergleichen, was bei dir anders ist…

Code: Alles auswählen

<?php
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    
    $dirToScan = '/Users/atarimaster/Sites/pfad/zum/verzeichnis';
    $fileList = scandir($dirToScan);
?>
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Test!</title>
</head>
<body>
    <?php
    echo "<pre>\n scanning $dirToScan ... \n\n";
    if (empty($fileList)) {
        echo "nix gefunden! \n";
    }
    foreach ($fileList as $f)
    {
        if (substr($f, 0, 1) == '.') {
            continue;
        }
        $size = getimagesize($dirToScan.'/'.$f);
        if (!empty($size)) {
            echo "$f : $size[0] x $size[1] \n";
        }
    }
    echo "</pre>\n";
    ?>
</body>
</html>
Ich habe keine Ahnung, aber davon jede Menge.
Benutzeravatar
Charlymarx
Beiträge: 51
Registriert: Mo 21. Feb 2022, 20:04

#6

Beitrag von Charlymarx »

Bei der Auskommentierung der Ermittlung des Inhaltsverzeichnisses und Vorgabe einer Einzelnen Bilddatei mit den entprechenden Informationen im Header (aus dem Ordner, von dem das Inhaltsverzeichnis ermittelt wird, wird die Info zur Datei und auch die IPTC-Information korrekt ausgelesen und angezeigt

Das ist der zu Grunde liegende Code:

Code: Alles auswählen

		$directory = array();											//
			$section= array();
			$size= array();
			$imageinfo= array();
			$iptc= array();
			// 
			$verzeichnis_flag = chdir ($hauptordner);					// Versuch: Wechsel von den Themenordner in den Ordner für Bildanzeige 
			//echo 'Verzeichniswechsel in den Hauptordner \n <br/>';
			if ($verzeichnis_flag){										// Wechsel erfolgreich
				$verzeichnis = opendir ($bilderordner);					// Versuch: Bild-Ordner öffnen für Lesen des Inhaltsverzeichnisses				
				//echo 'Bilderordner öffnen' . $verzeichnis . '\n <br/>';
				if ($verzeichnis){										// Ordner erfolgreich geöffnet
					//echo 'Verzeichnis einlesen \n <br/>';
					$i = 0;
					while ($file = readdir ($verzeichnis)){				// Inhaltsverzeichnis einlesen
						if ($file != '.' && $file != '..' && $file !=  '.DS_Store') {		// Verzeichniseinträge in Liste übernehmen ohne .. und . Einträge
							$directory[$i] = $file;
							echo "Datei: " . $directory[$i] . " \n <br/>";
							$i++;											// Einträge hochzählen
						}
					}
					$anzahl= $i--; 											// Anzahl Verzeichnis-Einträge festhalten (Achtung! Zählung beginnt bei 0)
					echo 'Anzahl Dateien: ' . $anzahl . '<br/>';
					if ($anzahl > 0){										// Wenn mehr als ein Eintrag vorhanden => natürliche Sortierung durchführen
						natsort ($directory);
					}
					closedir ($verzeichnis); 								// Vorschau Datei-Einträge erfasst => Ordner wieder schließen
	 			}
			}
			for ($i=0;$i<=$anzahl;$i++){       // diese Schleife wird ebenfalls auskommentiert
			//	$bilddatei= $directory[$i]; 
				$bilddatei= beispiel3.jpg;  // Ersatz-Datei zum Test
				$bilddatei= $pfad . $bilddatei; 
			   	$size = GetImageSize($bilddatei,$imageinfo);				// Bilddaten werden in einen Array ausgelesen
			echo "-----Ausgabe von GetImageSize 1. Parameter (Array Size)--- <br/>\n";	// Ausgabe der Funktionsergebnisse aus Array
   			echo "Bildbreite: " . $size[0]. "<br/>" . "\n";
   			echo "Bildhöhe: " . $size[1]. "<br/>" . "\n";
   			echo "Bildtyp: " . $size[2]. "<br/>" . "\n";
   			echo "HTML-Zeichenkette: " . $size[3]. "<br/>" . "\n";
				$bildbreite[$i]= $size[0]; 									// original Bildbreite des jeweiligen Bildes
				if ($bildbreite[$i]==0) $bildbreite[$i]= 2976;
				$bildhoehe[$i]= $size[1];									// original Bildhöhe des jeweiligen Bildes
				if ($bildhoehe[$i]==0) $bildhoehe[$i]= 3968;
				echo 'Datei: ' . $bilddatei . ' Bildbreite size(0): ' . $size[0] . '<br/>';
				echo 'Datei: ' . $bilddatei . ' Bildbreite Ersatz: ' . $bildbreite[$i] . '<br/>';
				if (isset($imageinfo["APP13"])) {							       // 2. Funktionsparameter der Funktion GetImageSize enthält IPTC-Daten wenn Marker "APP13" vorhanden
					$iptc = iptcparse($imageinfo["APP13"]);					// IPTC - Bilddaten ab Marker "APP13" auslesen und in zweidimensionales Array schreiben 
				//var_dump($iptc);										// Dump der IPTC-Daten
					$beschreibung[$i]= "";
					foreach($iptc as $key => $inhalt){
						foreach($inhalt as $key2 => $wert){
							for ($j=0; $j < sizeof($wert);$j++){ 
								switch ($key) {								// Bezeichner lt. IPTC IIM-Standard dem Schlüssel zuordnen und ggf. Datenumformung/Decodierung
									case "2#120":	// Beschreibung
										$beschreibung[$i].= $wert . "<br/";
										break;
									case "2#116":	// Copyright
										$beschreibung[$i].= $wert . "<br/";
										break;
								}
							}
						}
					}
				}
				else {
				echo "-----Keine IPTC-Infos gefunden (kein APP13 Blockmarker vorhanden)----<br/>"  . "\n <br/>"; 
				}
			}
Bild
Benutzeravatar
Charlymarx
Beiträge: 51
Registriert: Mo 21. Feb 2022, 20:04

#7

Beitrag von Charlymarx »

Hier die Bilddatei - hat in der Anwort mit dem Code nicht funktioniert
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Benutzeravatar
Atarimaster
Beiträge: 3158
Registriert: So 6. Feb 2022, 22:09
Wohnort: Ruhrgebiet

#8

Beitrag von Atarimaster »

Ich habe jetzt gleich eine kleine Telekonferenz, daher erstmal nur in aller Kürze:
– Ich kann bei deinem Code leider nicht sehen, ob die Variable $pfad (Zeile 33 in deinem Code) korrekt gesetzt wird.
Wird bei dem Script denn gar nichts ausgegeben, oder kommt der hartcodierte Text der echo-Zeilen (35 - 39) in der korrekten Anzahl; nur halt ohne die gewünschten Werte für Breite/Höhe/Bildtyp etc.?

– Und schon beim Einlesen des Verzeichnisses: Wird da die Zeile 10 (echo "Datei: " . […]) ausgegeben?

– Vermutlich nicht für den Fehler verantwortlich, aber einfacher (und daher auch weniger fehleranfällig):
Ich würde mir die Abfolge von chdir(), opendir(), readdir() sparen und stattdessen, wie in meinem Beispielcode, auf scandir() zurückgreifen.
Die unerwünschten Dateien (if ($file != '.' && $file != '..' && $file != '.DS_Store')) kannst du dann beim Durchlaufen des Arrays überspringen.

Später kann ich deinen Code dann auch noch einmal richtig testen.
Ich habe keine Ahnung, aber davon jede Menge.
Benutzeravatar
Atarimaster
Beiträge: 3158
Registriert: So 6. Feb 2022, 22:09
Wohnort: Ruhrgebiet

#9

Beitrag von Atarimaster »

So, ich konnte das jetzt testen.
Wenn ich die Variablen $hauptordner, $bilderordner, $pfad mit den richtigen Werten befülle, funktioniert bei mir das Auslesen von Bildbreite, -höhe, -typ sowie der HTML-Zeichenkette; sowohl bei Einzeldateien, als auch über das ganze Verzeichnis.

Das Auslesen der IPTC-Information geht mit deinem Code bei mir hingegen gar nicht, also auch nicht bei Einzeldateien.
Aber das ist ein anderes Problem – wenn es bei dir bei einzelnen Dateien funktioniert, sollte das nach o.g. Änderung auch mit allen Dateien des Verzeichnisses laufen.
Ich habe keine Ahnung, aber davon jede Menge.
Benutzeravatar
Atarimaster
Beiträge: 3158
Registriert: So 6. Feb 2022, 22:09
Wohnort: Ruhrgebiet

#10

Beitrag von Atarimaster »

Nachtrag:
Wenn ich statt meiner eigenen Bilder das von dir hochgeladene "beispiel3.jpg" nehme, funktioniert auch das Auslesen der IPTC-Daten.

Offensichtlich sind bei meinen Dateien, die ich für den Test gerade verwendet habe, die IPTC-Daten irgendwie anders aufgebaut. Ist also tatsächlich nicht Teil des Problems.
Ich habe keine Ahnung, aber davon jede Menge.
Benutzeravatar
Charlymarx
Beiträge: 51
Registriert: Mo 21. Feb 2022, 20:04

#11

Beitrag von Charlymarx »

Vielen Dank für den Test.
Erst mal eine gut Nachricht: Mit deinem Konstrukt läuft es einwandfrei - ob mit eine Einzeldatei oder mit den gesamten Katalog.

Ich habe mit meinem Konstrukt ja auch ein Inhaltsverzeichnis erstellt mit einer Einzeldatei im Ordner aber auch da hat es nicht funktioniert obwohl der ganze Pfad übermittelt wurde. Das Inhaltsverzeichnis war ok aber die Funktionen zum Abruf der exif- und IPTC-Informationen führten zu keinem Ergebnis.

Dazu - zu deinem Test: IPTC Informationen werden nur bei .tiff und .jpg in den Header geschrieben, nicht aber bei .png und darüberhinaus habe ich auch bei meinem Tests bemerkt, dass nicht alle Programme den für ein Erkennen der IPTC-Informationen mit korrekt vor den IPTC-Daten gesetzten Marker "APP13" schreiben (zwischen APP1 und APP2). Sie schreiben ihn entweder gar nicht und schreiben nur die Daten hinter den Block APP1 oder sie hängen die Daten ganz hinten an. Die php-Funktionen sind aber auf den Marker angewiesen, ansonsten werden die Daten nicht erkannt.
Der GraphicConverter schreibt übrigens bei Datei-Formaten die keine Möglichkeit bieten, IPTC-Daten im Header unterzubringen, diese Daten als separate XMP-Datei wenn die IPTC-Option gesetzt ist. Diese kann dann auch entweder direkt interpretiert werden oder wieder zum Bild importiert werden und dann wieder z.B. beim Speichern als .jpg-Datei in den Header der Datei ausgegeben.

Mit der Ausgabe der vollständigen Fehlermeldungen samt Warnungen ist mir allerdings aufgefallen, dass für den Fall eines eindimensionalen Feldes und keines zweidimensionalen in dem geschachtelten Foreach das Zweite Foreach angemeckert wird (Warnung) obwohl es einwandfrei funktioniert, weil dann eben nur ein Wert durchgereicht wird. Das ist formell durchaus korrekt. Ich denke, die Warnung will damit nur zum Ausdruck bringen, dass nicht alle Einträge in der 2. Dimension besetzt sind und daher nur zur Kontrolle eine Warnung ausgegeben wird um möglicherweise auf später wirksame Fehlstellen hinzuweisen.

Vielen Dank für deine Mühe - jetzt habe ich einige wertvollen Erkenntnisse dazugewonnen und dazu von dir noch eine perfekte Lösung des Problems erhalten. - Und das Ganze auch noch sehr schlank. Sehr elegant.

Ich bin jetzt gerade dabei, ein html-Webformular aufzubauen, das dann die einzelnen IPTC-Informationen (auch einige exif-Informationen) wählbar für die Ausgabe mit den Bildern aufbereitet.
Zusammen mit den GraphicConverter lässt sich dann im Nu eine Webgalerie mit Vorschau aufbereiten, die dann keiner HTML-Kodierung mehr bedarf und auch keinen vollständigen Durchlauf der Aufbereitung mehr notwendig macht. Eine einzelne oder mehrere Bilddatei(en) mit führender Ordnungsnummer versehen für die Stelle an der sie angezeigt werden sollen (und die Dateinamen werden belassen) und eine daraus generierte Vorschau nach Bedarf in die entsprechenden Ordner (je einen für Bilder und Vorschau) hochladen und schon läuft das Ganze und zwar bis auf die wenigen Abfragen aktueller Anzeigegebenheiten bei Client in Javascript rein Serverbasiert.
Das ist das Ziel und dem dank deiner Hilfe einen guten Schritt nähergekommen.
Benutzeravatar
Atarimaster
Beiträge: 3158
Registriert: So 6. Feb 2022, 22:09
Wohnort: Ruhrgebiet

#12

Beitrag von Atarimaster »

Freut mich, dass ich helfen konnte! :)
Ich habe keine Ahnung, aber davon jede Menge.
Benutzeravatar
Charlymarx
Beiträge: 51
Registriert: Mo 21. Feb 2022, 20:04

#13

Beitrag von Charlymarx »

Leider ist die Kuh noch nicht ganz vom Eis: Das Konzept funktioniert bis auf eine Winzigkeit prächtig. Klickt man auf ein Foto der Vorschau um daraus das große Foto Formatfüllend zu sehen, so gibt es keine Möglichkeit, den ganzen Katalog einer Webgalerie (die mit den großen Fotos) aus der Vorschau heraus genau mit diesem Foto zu starten, denn es gibt keine Möglichkeit dem Programm für die Webgalerie mit dem Klick (Tip) auf ein Foto (Link mit href bzw. Formular) der Vorschau den Index dieses Fotos mitzuteilen. Es findet sich mit $_GET... nur der letzte Eintrag und das Vorschaubild als Submit-Knopf heranzuziehen funktioniert auch nicht, da die Vorschaubilder nicht herunterskaliert werden sondern ein beliebiger Ausschnitt herangezogen wird.
Was mir fehlt, ist eine Reaktion auf den Klick auf ein Vorschaubild in der Form der Übermittlung von dessen Index an das Folgeprogramm.
Alle Ideen habe ich dazu aufgebraucht. Die haben nicht wie geplant funktioniert.
Welche Möglichkeit bleibt noch?
Benutzeravatar
Atarimaster
Beiträge: 3158
Registriert: So 6. Feb 2022, 22:09
Wohnort: Ruhrgebiet

#14

Beitrag von Atarimaster »

Ich muss zugeben, dass ich jetzt nicht so ganz verstanden habe, was denn der Wunsch-Zustand ist … :oops:

Aber ich nehme an, dass »Programm für die Webgalerie« ist nicht selbstgeschrieben, sondern etwas, was du dir irgendwo fertig runtergeladen hast; und nun müsstest du einen Parameter übergeben, der von dem fraglichen Script nun einmal nicht ausgewertet wird.
Ist das richtig so?
Ich habe keine Ahnung, aber davon jede Menge.
Benutzeravatar
Charlymarx
Beiträge: 51
Registriert: Mo 21. Feb 2022, 20:04

#15

Beitrag von Charlymarx »

Nein, ist komplett selbst geschrieben.
Der Wunschzustand wäre - eine Vorschau mit quadratischen Bildern, die möglichst platzsparend aber trotzdem was Erkennbares bietet - wie die interne Galerie bei Android, und von dort soll mit Klick auf ein Vorschaubild unter bester Ausnutzung des Anzeigefeldes das angeklickte Bild dargestellt werden und von dort aus soll in beide Richtungen - vor und zurück navigiert werden können. Das soll sowohl für Darstellung in variablen Rechnerfenstern als auch bei Mobilgeräten funktionieren. - So weit bin ich schon. Was fehlt ist unten dargestellt.
Das Ganze soll von 2 Webseiten mit php für beliebig viele Bilder sein und auch die Bildunterschrift (3-4 zeilig) aufnehmen, und was das Wesentliche dabei ist: Es braucht keine der Webseiten bei Bildwechsel geändert und wieder hochgeladen werden. Auch nicht lokal eine vollständige Neugenerierung mit so viel (zugegbenermaßen) kurzen Webseiten wie Bilder vorhanden sind und diese dann auch samt Bildern wieder hochgeladen werden wie es das Adobe, der GraphicConverter oder z.B. das Programm Galerie so machen.
Bei meiner Galerie brauchen nur die Bilder vor dem Dateinamen eine Ordnungsnummer angehängt bekommen und desgleichen die Vorschaubilder (kann mit den GraphicConverter im Bilderbrowser und dann die Vorschaugenerierung im Stapel ganz elegant erledigt werden) und auch nur diese hochgeladen werden. Wenn Bilder wegfallen sollen, sind nur diese am Webserver zu löschen.
So etwas soll dann von Webgalerie-Betreibern (Laien) gut und schnell selbst erledigt werden. Dazu soll es dann ein Passwortgeschütztes Hochladeprogramm bzw. Organisationsprogramm (zum Löschen) geben.

Mein Problem ist nun: Ich muss von dem in der Vorschau angeklickten Bild den Index an das Galerieprogramm für die großen bzw. vergrößerten Bilder mitteilen um das Bild dann anzuzeigen und um von dort aus im Galerieprogramm vorwärts und Rückwärts weiter zunavigieren.

Bei hunderten Vorschaubildern den Index für das jeweilige Bild über die URL für die Auswertung durch $_GET(Index) funktioniert nicht, da diese Konstruktion über die superglobale Speicherung nur einen Wert unter einem Namen aufnehmen kann und in der Schleife für die Darstellung in der Vorschau ist dies bei jedem Bild ein Eintrag in der URL. Das hat zur Folge, dass nur das letzte (oder erste Bild (durch Voreinstellung) durch $_GET(Index) korrekt ausgewertet werden kann.
In href URL können beim Anklicken aber keine anderen Nachrichten als ?Parameter1=parm1&Parameter2=parm2 an das aufgerufene Programm übergeben werden.

Das Vorschaubild in ein Formular gepackt und als Submit-Button verkauft ist ebenfalls höchst unbefriedigend und funktioniert auch nicht wie gewünscht. Javascript onclick ist auch keine rechte Lösung- zumindest haben meine Versuche nicht zufriedenstellend funktioniert.

Es geht also darum - mit dem Klick auf ein Vorschaubild (im Vorschauprogramm) dessen Index an das durch den Klick darauf aufgerufene Galerieprogramm zu übermitteln, damit genau dessen vergrößerte Darstellung des Bildes samt Bildunterschrift erfolgen kann.
Benutzeravatar
Atarimaster
Beiträge: 3158
Registriert: So 6. Feb 2022, 22:09
Wohnort: Ruhrgebiet

#16

Beitrag von Atarimaster »

Sorry, aber trotz deiner ausführlichen Erklärung habe ich es immer noch nicht ganz verstanden.
Charlymarx hat geschrieben: Sa 10. Dez 2022, 14:38 Es geht also darum - mit dem Klick auf ein Vorschaubild (im Vorschauprogramm) dessen Index an das durch den Klick darauf aufgerufene Galerieprogramm zu übermitteln, damit genau dessen vergrößerte Darstellung des Bildes samt Bildunterschrift erfolgen kann.
Ich kapiere nicht ganz, wo da das Problem liegen soll.
Entweder entspricht der Index der Ordnungszahl, die du im Dateinamen stehen hast, dann kannst du die ja dort herauslösen. Oder du meinst den numerischen Index des Arrays, das ich oben $fileList genannt hatte. Und auf den kannst du z.B. zugreifen, in dem du statt der Zeile foreach ($fileList as $f) etwa schreibst:
foreach ($fileList as $key => $value)

$key gibt dann den Index zurück, so dass du ihn im Link übergeben kannst. Allerdings deutest du ja an, dass eine Übergabe in Form von ?Parameter1=parm1&Parameter2=parm2 nicht ausreichend sei, also scheint das Problem doch woanders zu liegen…
Oder ist das Hauptproblem, im Galerieprogramm (für die "vorheriges/nächstes Bild"-Links) zu ermitteln, welchen Index diese Bilder haben?

Ich komme heute allerdings wieder nicht dazu, mich eingehend damit zu befassen, wir müssen in ca. einer Stunde weg…
Ich habe keine Ahnung, aber davon jede Menge.
Benutzeravatar
Charlymarx
Beiträge: 51
Registriert: Mo 21. Feb 2022, 20:04

#17

Beitrag von Charlymarx »

Das Problem ist nicht der Index (nicht die Ordnungsnummer, die ja Lücken haben kann!) den ich in der Vorschau ja im ganzen Programm zur Verfügung habe. Das stimmt schon alles.

Ich erzeuge aber in einer Schleife mit Zähler $index für jede Bilddatei ein

Code: Alles auswählen

<a href "bildergalerie.php?index=" . $index><img src="$vorschaupfad . $vorschaudatei[$index]".../></a>

Da steht in dem ersten Parameter auch der Index drinnen. Wird die Schleife dann beendet, sind alle Vorschaubilder angezeigt und es wird auf einen Klick gewartet - Klick entweder zurück zur Startdatei oder Klick auf ... und hier ist das Problem ... auf ein Vorschaubild.
Da steht ein href mit Link auf "bildergalerie.php?index...". Das href wird ordnungsgemäß ausgeführt und in "bildergalerie.php" verzweigt also diese Seite am Server geladen, das php-programm darin ausgeführt und das Ergebnis daraus zum Client befördert. Soweit so gut.

Was aber nicht gut ist: Durch die Schleife in der Vorschau wird n-mal

Code: Alles auswählen

"bildergalerie.php?index="index"
geschrieben wobei sich $index natürlich auf die Datei bezieht und sich wegen der Schleife laufend erhöht. Die superglobale Variable

Code: Alles auswählen

$_GET()
lässt aber nur einfache Variablen zu. Ein wiederholter Eintrag führt dazu, dass am Ende der Schleife nur der Index der letzten Datei in

Code: Alles auswählen

$_GET['$index']
drinnen steht, nicht aber der, der zu der angeklickten Vorschaudatei gehört.[/b]

Ich habe keinerlei Möglichkeit mit dem Link eine Mitteilung über das aktuell angeklickte Vorschaubild 12bild_xy.jpg oder dessen Index mitzuschicken. um ggf. im aufgerufenen bildergalerie.php diese Mitteilung auszuwerten.

Das ginge nur, wenn der Klick abgefangen wird und der Link derart bearbeitet wird, dass der Index der durch Klick ausgewählten Vorschaudatei mit eingebaut wird und dann vom aufgerufenen bildergalerie.php erhalten und ausgewertet werden kann.

Natürlich gäbe es noch die Möglichkeit n

Code: Alles auswählen

"bildergalerie" . $index . ".php"
zu generieren wie das bei den meisten Galerieprogrammen so gehandhabt wird. Genau das will ich mir ersparen. Selbst wenn es sich nur um n-Gerüste handeln würde, in die ich mit include den für die Darstellung der Bilder generell notwendigen php-Teil nachlade. Das wäre der letzte Strohhalm der mir noch einfällt, wenn es keine elegantere Lösung dafür gibt.

Der Knackpunkt ist also die fehlende Unterscheidung der URL im bzw. die Unmöglichkeit eine Information zu erhalten, welche Vorschaudatei[i| angeklickt wurde um diese der gerufenen

Code: Alles auswählen

bildergalerie.php
mitzuteilen.

Die Lösung per Javascript habe ich noch nicht gefunden um den Aufruf abzufangen, den Link mit aktuellem Parametern zu manipulieren und dann erst das manipulierte href mit neuer URL auszuführen.
Ich würde - falls es damit ginge, behelfsweise die URL in der Schleife wo das href geschrieben wird dergestalt ausführen, dass ich in der Schleife

Code: Alles auswählen

$index  .  "Bildergalerie.php"
oder falls das nicht geht

Code: Alles auswählen

"Bildergalerie.php" . $index
schreibe, was dann in einem auf

Code: Alles auswählen

onclick()
gestarteten Javascript in

Code: Alles auswählen

'bildergalerie.php?index="+index+'"';
umgewandelt und als href ausgeführt wird. Also eine mittelbare Ausführung des .
Das würde einen ganzen Haufen redundanter

Code: Alles auswählen

bildergalerie_xxx.php
und einen Teil für das Include sparen.

Wenn in GET auch arrays übergeben werden könnten, dann müsste ich diese auch mit dem Trick der Verknüpfung des Index (key) mit dem Bilddateinamen unterscheidbar machen oder aber im bildergalerie.php den Index über die Suche des array (bilddatei) ermitteln, aber leider gehen zweidimensionale arrays in GET nicht weil die einzelnen Parameter ja schon ein Array darstellen.
Benutzeravatar
Atarimaster
Beiträge: 3158
Registriert: So 6. Feb 2022, 22:09
Wohnort: Ruhrgebiet

#18

Beitrag von Atarimaster »

Ich komme mir langsam ein bisschen dumm vor, weil ich es immer nicht nicht verstehe. :frown:

Charlymarx hat geschrieben: So 11. Dez 2022, 21:32Ein wiederholter Eintrag führt dazu, dass am Ende der Schleife nur der Index der letzten Datei in

Code: Alles auswählen

$_GET['$index']
drinnen steht, nicht aber der, der zu der angeklickten Vorschaudatei gehört.
Das kapiere ich nicht.
Wenn du innerhalb der Schleife den Link samt Index ausgibst, steht doch natürlich der aktuelle Wert des Index im Link.
Der Wert der letzten Datei würde nur dann übernommen, wenn der Link außerhalb der Schleife ausgegeben würde.

Charlymarx hat geschrieben: aber leider gehen zweidimensionale arrays in GET nicht
Das stimmt nicht.
Wenn ich einen Link wie folgt schreibe:

Code: Alles auswählen

ziel.php?param[1][a]=1a&param[1][b]=1b&param[1][c]=1c&param[2][a]=2a&param[2][b]=2b
… und in der ziel.php dann ein print_r($_GET); drinsteht, gibt sie mir aus:

Code: Alles auswählen

Array
(
    [param] => Array
        (
            [1] => Array
                (
                    [a] => 1a
                    [b] => 1b
                    [c] => 1c
                )

            [2] => Array
                (
                    [a] => 2a
                    [b] => 2b
                )

        )
)
– wobei ich jetzt aber eigentlich nicht wirklich glaube, dass dies weiterhilft.
Ich denke, weitere Erklärungen bringen hier nichts, wie scheinen irgendwie aneinander vorbei zu reden. Eventuell würde der Quellcode der fraglichen Schleife weiterhelfen.
Ich habe keine Ahnung, aber davon jede Menge.
Benutzeravatar
Charlymarx
Beiträge: 51
Registriert: Mo 21. Feb 2022, 20:04

#19

Beitrag von Charlymarx »

Vielen Dank für die Analyse.
Was die superglobale Variable $-GET betrifft, hast du mir schon gut weitergeholfen. Ich hatte da das Manual wohl missverstanden und mich auf einfache Variablen eingerichtet. - Man sollte alles mal ausprobieren!
Natürlich kann dies nicht bei Klick auf ein Vorschaubild den Index der Vorschau an das Galerieprogramm schicken aber ich habe da schon Verwendung dafür.

Was die Schleife betrifft - steht am Ende der Schleife (vorausgesetzt man nützt nicht die 2. Dimension und weist dementsprechend zu) tatsächlich nur der letzte Indexwert drinnen.

Ich habe aber tatsächlich die Kuh vom Eis bekommen und das Ganze funktioniert nun über den Umweg Javascript.
Ich habe in der href nun eine URL zu einer Javascript-Funktion drinnen, die auf Klick auf ein Vorschaubild aufgerufen wird und als Parameter den Index deses Vorschaubildes übermittelt bekommt. Diese ruft dann ihrerseits die Galerieseite auf und gibt den Index als Parameter weiter, der dann über $_GET['$index'] in der Galerieseite ausgelesen werden kann und das zur Vorschau zugehörige Bild groß darstellt. Mit Steuerelementen kann man dann vorwärts oder rückwärts blättern oder aber an den Anfang springen bzw. zur Vorschau oder Startseite zurückkehren.
Mit dem Bild wird die Information Bildnummer / Anzahl Bilder ausgegeben und unten drunter die IPTC-Informationen - 1-4 Zeilen je nach Bedarf. Schiebt man am Rechner das Fenster zusammen wird das Bild 'resized' und kleiner dargestellt bzw. beim Aufziehen größer - so lange das Bild samt Steuerelementen und IPTC-Informationen in der Höhe draufpasst. Das Bild wird immer mittig im Fenster dargestellt. Bei Mobilgeräten wird ebenfalls erst auf die darstellbare Bildschirmgröße angepasst und man kann dann das Bild mit der üblichen Geste aufziehen.

Nun geht die Optimierung und Feinarbeit los.
Am Ende schicke ich dir den Quelltext zu dem Galeriepaket aus 4 Dateien.

Eine php-Datei für die Vorschau und eine für die Galerie. Dann kommt noch die Datei die die IPTC und ausgewählte EXIF-Bildunterschriftoptionen zur Auswahl stellt. die 4. Datei erlaubt das passwortgeschützte Hochladen von Bildern und Vorschauen und zur Bildverwaltung.

Das wesentlich an dem Konzept ist, dass es nur 2 PHP-Programme gibt, die für "beliebig" viele Bilder samt Vorschauen ohne Änderung an den Programmen gibt und so geeignet sind, eine Webgalerie durch den Benutzer selbst zu pflegen und dabei auch nur die Bilder zu tauschen, die auch gewünscht sind und nicht lokal einen Generatordruchlauf benötigen und anschließend muß das Alles zusammen auf den Server gebracht werden -für jedes Bild eine eigene HTML-Seite, das Bild selbst und die Vorschau.
Die Vorgabe für den Besitzer einer solchen Webgalerie ist lediglich - die Bilder erhalten vor dem eigentlichen Dateinamen eine Ordnungsnummer um richtig sortiert ausgegeben zu werden. Dann erzeugt man, wenn noch nicht geschehen, die IPTC-Daten für die Bilder. Anschließend werden (zur besseren Betrachtung auf Mobilgeräten wie Handys quadratische) Vorschauen erzeugt. Die Bilder und Vorschaubilder werden in je einen Ordner bilder und vorschau hochgeladen.
Ein Bildwechsel Tauschen, Einfügen und Löschen kann dann auch programmiert über ein Verwaltungsprogramm erfolgen.

Wenn das fertig ist, kommt die andere (bestehende) Galerie dran, die dem gleichen Konzept folgt, jedoch die Vorschauen werden wie beim iPhone unten in einem iFrame dargestellt und sind mit dem großen Bild zu sehen. Gegenwärtig ist noch einiges an Handarbeit an der Vorschau zu leisten, das soll dann auch wegfallen, denn ich halte unnötigen Aufwand für die Pflege einer Webgalerie für völlig überflüssig, das kann der Blechkamerad gut übernehmen und man sollte sich nicht die Finger abbrechen müssen, ihm das beizubringen samt der einen oder anderen Gestaltungsvariante.
Benutzeravatar
Atarimaster
Beiträge: 3158
Registriert: So 6. Feb 2022, 22:09
Wohnort: Ruhrgebiet

#20

Beitrag von Atarimaster »

Charlymarx hat geschrieben: Mo 12. Dez 2022, 08:22 Am Ende schicke ich dir den Quelltext zu dem Galeriepaket aus 4 Dateien.
Ja, das würde mich schon interessieren (Mailadresse bekommst du per PN, so dir dieser Weg lieber ist, als das Paket hier zu posten). Ich habe so um 2010 etwas Ähnliches geschrieben, also eine Galerie, die man einfach dadurch »gefüttert« hat, indem man die (Groß-) Bilder einfach in ein Verzeichnis auf dem Server geworfen hat. Drei Unterschiede gab es aber:

1. Auch die Vorschaubilder wurden per PHP erzeugt; bzw. konnte man sie erzeugen lassen (beim Aufruf der Galerie wurde zunächst das Verzeichnis der Großbilder eingelesen, war kein gleichnamiges Vorschaubild vorhanden, wurde es erzeugt).

2. Anzeige der Großbilder geschah nicht in einer eigenen PHP-Datei; stattdessen habe ich einen der unzähligen »Lightbox«-Clones verwendet, um sie in einem per JS-Overlay anzuzeigen (dieses JavaScript war der einzige Teil, der nicht selbstgeschrieben war).

3. IPTC-Daten habe ich gar nicht ausgelesen.

Ich habe keine Ahnung, ob dieses Script noch läuft oder ob es aufgrund von Änderungen in PHP den Dienst verweigern würde. Müsste ich beizeiten mal spaßeshalber überprüfen.
Na ja, deshalb fände ich es interessant, mal deine Lösung zu sehen.
Ich habe keine Ahnung, aber davon jede Menge.
Antworten