# bildgröße



## blubber (11. Januar 2003)

Hi,
ich hab für mein newsscript (php) eine bildupload funktion eingebaut, mit der ich eben bilder zu den news uppen kann. Diese sind meist im jpg format, und haben eine größe von 1024x768
Für mein Newsscript änder ich die Größe des Bildes natürlich auf ca 150x100 pixel, ganz simpel halt mit width="150" height="100". Allerdings hab ich ja so das Problem, dass das große Bild nur kleiner angezeigt wird, also immernoch die volle Dateigröße hat. Nun kann man sich ja vorstellen, das bei 10 News, mit 10 Jpg Bildern und ca 100kbyte pro Bild, der User 1MB alleine schon an den News saugen darf.
Nun meine Frage. Es muss doch eine Möglichkeit geben, dass die Bilder nicht nur in ihrer LängexBreite kleiner werden, sondern auch in ihrer Dateigröße. Sprich, wenn ich ein 1024x768 jpg bild mit 200kbyte größe auf eine effektive anzeigegröße von 150x100 schrumpfe, auch die 200kbyte schrumpfen. Beispiel: http://www.turtled.com
Die werden doch net vor jedem Newspost von Hand die Bildgröße ändern, nur um eine geringe Dateigröße zu erreichen !?

Hoffe mein Problem wurde verstanden


----------



## Matthias Reitinger (11. Januar 2003)

Weil ich grade nichts zu tun hatte und ich zur Zeit alles in Klassen kapsle, hab ich dir mal eine Thumb-Klasse geschrieben, die dir bei deinem Problem helfen sollte 


```
<?
// Inhalt: Klasse zum Erstellen von Thumbnails
// Autor:  Reitinger Matthias a.k.a. reima (plz give proper credit)

class thumb
{
	var $im = 0;

	function thumb($file=0, $width=0, $height=0)
	{
		if ($file && $width && $height) {
			$this->create($file, $width, $height);
		}
	}

	function create($file, $width=0, $height=0, $resample=0)
	{
		if ($this->im) $this->clear();

		list($src_width, $src_height, $src_type) = getimagesize($file);
		if ($src_type != 2) return false; // kein jpeg => abbrechen
		
		if ($width == 0) {
			$width = round($height * ($src_width/$src_height));
		}
		if ($height == 0) {
			$height = round($width * ($src_height/$src_width));
		}
		
		$src_im = imagecreatefromjpeg($file);
		$this->im = imagecreatetruecolor($width, $height);
		
		if ($resample) {
			imagecopyresampled($this->im, $src_im, 0, 0, 0, 0,
				$width, $height, $src_width, $src_height);
		} else {
			imagecopyresized($this->im, $src_im, 0, 0, 0, 0,
				$width, $height, $src_width, $src_height);
		}
		
		imagedestroy($src_im);
				
		return true;
	}

	function savetofile($file, $quality=75)
	{
		imagejpeg($this->im, $file, $quality);
	}

	function output($quality=75)
	{
		header("Content-type: image/jpeg");
		imagejpeg($this->im, "", $quality);
	}

	function clear()
	{
		imagedestroy($this->im);
		$this->im = 0;
	}
}
?>
```

*Benutzung*

_Beispiel 1: _

```
<?
include("class.thumb.php"); // oder was auch immer

$thumb = new thumb(); // Klasseninstanz erstellen
$thumb->create("bild1.jpg", 320, 240); // Thumbnail erstellen
$thumb->output(); // Bild an den Browser ausgeben
$thumb->clear(); // Aufräumen
?>
```
Ergebnis: Ausgabe eines 320x240 großen Thumbnails von bild1.jpg


_Beispiel 2: _

```
<?
include("class.thumb.php");

$thumb1 = new thumb();
$thumb1->create("bild1.jpg", 320, 0, 0);
$thumb1->savetofile("bild1t1.jpg", 60); // Bild speichern
$thumb1->clear();

$thumb2 = new thumb();
$thumb2->create("bild1.jpg", 0, 480, 1);
$thumb2->savetofile("bild1t2.jpg", 80);
$thumb2->clear();
?>
```
Ergebnis:
1. Ein Thumbnail "bild1t1.jpg" mit folgenden Eigenschaften wird auf dem Server gespeichert:
Höhe: 320
Breite: wird automatisch ermittelt (0 bei create())
Verkleinerungsart: normal
Qualität: 60 (letzter Parameter bei savetofile)

2. Ein zweites Thumbnail "bild1t2.jpg" mit folgenden Eigenschaften wird auf dem Server gespeichert:
Höhe: wird automatisch ermittelt (wieder 0 bei create())
Breite: 480
Verkleinerungsart: Resampling (letzter, optionaler Parameter bei create() auf 1)
Qualität: 80


Du hast jetzt zwei Möglichkeiten bei deinem konkreten Problem: Entweder du erzeugst die Thumbnails direkt nach dem Hochladen und speicherst sie auf dem Server. Das garantiert schnelle Ladezeiten bei den Bildern, aber hohen Webspaceverbrauch. Die Alternative wäre, die Thumbnails auf Anforderung zu erzeugen und direkt an den Browser zu senden. Das erhöht zwar einerseits die Serverlast und im Extremfall auch die Ladezeiten, spart aber Webspace. Liegt an dir =)


----------



## blubber (12. Januar 2003)

hi reima,

ui ui ui, hätte nicht gedacht, dass dafür so ein act notwendig ist. Vielen Dank erstmal für deine Bemühung, ich werd das nun mal ausprobiern 

bye


----------



## blubber (13. Januar 2003)

Hi nochma,
hab soeben dein script ausprobiert, funzt ohne probleme, danke nochmal 
Eine Frage hätte ich dann aber noch, und zwar, wo aktivier ich den GD Support bei meinem Apache System ?

bye


----------



## THE REAL TOOLKIT (13. Januar 2003)

Die GD Library musst du dir erst mal downloaden.
Dann noch einen Eintrag in der htpd.conf anpassen...


----------



## blubber (13. Januar 2003)

ok, dank dir.


----------



## MsvP (20. Januar 2003)

also mein server hat:
gd
GD Support enabled 
GD Version 1.6.2 or higher 
JPG Support enabled 
PNG Support enabled 
WBMP Support enabled 


wenn ich jetzt die datei so mache wie oben beschrieben bekomme ich die fehler meldung:
Warning: imagecreatetruecolor(): requires GD 2.0 or later in /home/www/web207/html/msvp/habdichliebhasi/foto/class.thumb.php on line 31

Warning: imagecopyresized(): supplied argument is not a valid Image resource in /home/www/web207/html/msvp/habdichliebhasi/foto/class.thumb.php on line 38

Warning: imagejpeg(): supplied argument is not a valid Image resource in /home/www/web207/html/msvp/habdichliebhasi/foto/class.thumb.php on line 48

Warning: imagedestroy(): supplied argument is not a valid Image resource in /home/www/web207/html/msvp/habdichliebhasi/foto/class.thumb.php on line 59


Muss ich noch was installieren oder, ist meine gd version zu niedrig?!

Gre@tz Msv P!!!


----------



## d4k4 (21. Januar 2003)

steht doch da 
du hast version 1.6
version 2.0 oder höher ist aber eforderlich


----------



## MsvP (21. Januar 2003)

ja gut hab ich auch gesehen, ich hofe jetzt eher auf ne lösung, um das problem zu umgehen?!

Gibts da ne alternative, oder so?


----------



## d4k4 (21. Januar 2003)

hol die doch die aktuelle gd libary

http://www.boutell.com/gd


----------



## MsvP (21. Januar 2003)

Mah aber ich kann doch nciht die gd library von meinem Server aktualisieren, oder?! Das liegt doch am provider ob die da ne neuere oder ältere drauf haben , oder?!
*Sich da nicht auskennt!

Gre@tz Msv P!!!


----------



## d4k4 (21. Januar 2003)

uh das weiss ich auch nicht inwieweit dir der provider da entgegen kommt

test es erstmal lokal und wenn sich der provider sträubt -> serverwechsel


----------



## Matthias Reitinger (21. Januar 2003)

Hm... schreib mal imagecreate anstatt imagecreatetruecolor... könnte funktionieren, muss aber nicht.


----------



## Sir Robin (21. Januar 2003)

...wird dann auch, weil GD<2.0 keine TrueColor Unterstützung hat...und deswegen den Befehl nicht kennt...

...entweder du hast Glück und dein Hoster (ich nehme mal an Puretec, kommt mir nämlich bekannt vor) updatet die GD-Lib, oder er updatet PHP (PHP 4.3.0 hat GD 2.x einkompiliert) oder du versuchst dein Glück mal mit dl()und lädst damit selbst die GD2 nach...kann klappen


----------



## MsvP (21. Januar 2003)

Mhh wie benutze ich denn den dl?! bool dl ( string library)

Hab mir das grad durchgelesen, abe rnciht wirklich kapiert! muss ich dafür die gd library runter laden und dann irgendwie meinen ordner angeben beim dl befehl?!

Gre@tz Msv P!!!
Ps: Ist übrigens nicht puretec!


----------



## Sir Robin (21. Januar 2003)

```
<?php

dl("Pfad/zur/gd2.dll");

?>
```

...schick oder?  Für Unix ist es gd2.so ..

P.S.: bei der Manual gibt´s für den Befehl dl() auch genauso ein Beispiel


----------



## MsvP (21. Januar 2003)

ALso ich wieß jcith irgendwie bin ich wohl einfach zu blöd, hab mir gerade die gd.zip gezogen aber irgendwie kapier ich nich was davon jetzt eigentlich angegeben werden muss. Also bei der pfad angabe, du hast gd.dll geschrieben, aber da ist ja nicht mal ne dll datei drin! :/

Ach ja habs grad mal mit imagecreate statt imagecreatetrucolor probiert, jetzt habe ich folgende fehler meldung:
Warning: imagejpeg: unable to open 'test.jpg' for writing in /home/www/web207/html/msvp/habdichliebhasi/foto/class.thumb.php on line 48


----------



## THE REAL TOOLKIT (22. Januar 2003)

is doch klar,der findet die test.jpg net


----------



## MsvP (22. Januar 2003)

Ja ne haha! Sehr lustig! 

Der kann die doch garnicht finden, die soll ja erstellt werden!
Warte mein Quellcode:
<?
include("class.thumb.php");

$thumb1 = new thumb();
$thumb1->create("00000.jpg", 480, 0, 0);
$thumb1->savetofile("test.jpg", 60); // Bild speichern
$thumb1->clear();
?>

die 00000.jpg liegt in dem gleichen Ordner!!!


----------



## Matthias Reitinger (22. Januar 2003)

Verzeichnisrechte überprüfen...


----------



## MsvP (22. Januar 2003)

Oh.. ähm.. mhh... 

Das wars wohl! *peinlich


----------



## blubber (26. Januar 2003)

*...*

ich hätte da jetzt doch noch eine frage, und zwar, wenn ich als bilddatei NICHT eine file angebe, sondern eine URL wie z.B. diese hier http://localhost/forum/attachment.php?postid=$postid , was ebenfalls dem Bild entspricht, wie funktioniert das dann? Wenn ich die class.thumb von reima include, erhalte ich in zeile 30 einen fehler. Ich denke mal, er erwartet halt einfach eine "echte" jpg datei. Gibts dafür ne lösung?

so solls aussehen und funktionieren 


```
include("class.thumb.php"); // oder was auch immer
$thumb = new thumb(); // Klasseninstanz erstellen
$thumb->create("http://localhost/forum/attachment.php?postid=$postid", 320, 240); // Thumbnail erstellen
$thumb->output(); // Bild an den Browser ausgeben
$thumb->clear(); // Aufräumen
```

*edit*

außerdem bekomm ich noch eine fehlermeldung, 

"Cannot add header information - headers already sent..." 

wegen der Zeile in der class.thumb.php wo es heisst 

header("Content-type: image/jpeg");

Lässt sich das mit dem header von der class.thumb "umgehen" ?

bye


----------



## ByeBye 8492 (2. Februar 2003)

Moinsen

wie kann man das machen, das z.b. 
Das Bild verleinert wird, der Thumbnail dann als Link zum richtigen Bild genutzt werden kann.
Ich brauche so ein Script naemlich fuer mein Downloadsystem, da kann man ein Bild von einer URL angeben ( http://irgendeine.de ), das er das Bild dann in der DB speichert ( also als Link) und das er dann spaeter bei der Ausgabe, das Bild auf 150*100 verkleiner wieder ausgibt. 

Kann man das auch machen, weil sonst wuerden alle User die das Downloadsystem benutzen wollen ziemlich viele Daten runterladen, und ich glaube das wird meinem Projekt nicht gut tun, da die User ja nicht erst warten wollen bis alle Bilder geladen sind.

Kann man die Bilder von anderen URl's verkleinert ( Groesse und Size(KB)), auf meiner Page ausgeben lassen?

Wenn ja wie

Thx fuer eure Antworten im Vorraus


----------



## luv (25. April 2003)

*Image verkleinnern und text hinzufügen*

Hallo,

Die JPG zu verkleinnern geht prima.
Ich möchte aber gerne noch in die verkleinnerten
bilder ein text oder ein logo zb. unten links automatisch
einfügen lassen , welche lösungsansätze gibt es.


danke 
luv


----------



## phisee (6. April 2004)

hab da noch so ein Problem

$thumb->safetofile funktioniert wunderbar

aber bei
$thumb->output
kommt nur sowas heraus:

ÿØÿàJFIFÿþ>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀd"ÿÄ ÿÄµ}AQa"q2?‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢£¤¥¦§¨©ª²³´µ¶·¸¹ºÂÃÄÅÆÇÈÉÊÒÓÔÕÖ×ØÙÚáâãäåæçèéêñòóôõö÷øùúÿÄ ÿÄµwAQaq"2?B‘¡±Á #3RðbrÑ $4á%ñ&'()*56789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz‚ƒ„…†‡ˆ‰Š’“”•–—˜™š¢

und so weiter.

Was mache ich falsch?


----------



## Sven Petruschke (6. April 2004)

Du gibst das Bild als HTML-File aus und nicht als Bild.


----------



## Vaio82 (9. Juni 2004)

->  header("Content-type: image/jpeg"); 

funktioniert leider nicht... ansonsten wohl eine sehr schöne Sache.


```
Warning: Cannot modify header information - headers already sent by (output started at /www/htdocs/v034347/class.thumb.php:60) in /www/htdocs/v034347/class.thumb.php on line 50
ÿØÿàJFIFÿþ;CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), quality = 75 ÿÛC    $.' ",#(7),01444'9=82<.342ÿÛC  2!!22222222222222222222222222222222222222222222222222ÿÀð@"ÿÄ ÿÄµ}AQa"q2?‘¡#B±ÁRÑð$3br‚ %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyzƒ„…†‡ˆ‰Š’“”•–—˜™š¢
```


----------



## Mako (12. Juli 2004)

Hi Leute,

wenn ich das Script verwenden will bringt er mir einen Fatal error, dass die Funktion imagecreatefromjpeg() nicht definiert ist. Kann es sein, dass ich hier noch was installieren muss, dass das läuft?

Danke für eure Bemühungen

Markus


----------



## low-group (13. Juli 2004)

Lies dir diesen Thread mal genau durch, dann findeste auch eine Antwort.


----------



## Mako (13. Juli 2004)

Hi low-group,

ich hab mir den Beitrag jetzt noch einmal komplett durchgelesen. Leider konnte ich das Problem dennoch nicht beheben. Was übersehe ich?

Grüße Markus


----------



## KoMtuR (13. Juli 2004)

@mako

Du musst die GD-Lib installiert haben. Ist klar, dass er die Fkt. nicht findet 

@luv
um ein kleines Logo im Bild einzufügen müsstest du dich mit der Funktion [phpf]imagecopy[/phpf] auseinandersetzen. Am Besten du schaust mal hier .

@blubber
In der Definition von imagecreatefromjpeg steht dieser hinweis


> Tip: You can use a URL as a filename with this function if the fopen wrappers have been enabled. See [phpf]fopen[/phpf] for more details on how to specify the filename and Appendix L for a list of supported URL protocols.


Schau da mal nach. Am besten unter der Definition von [phpf]imagecreatefromjpeg[/phpf]

Die Benutzer, die irgendwelchen kryptischen Sachen ausgegeben bekommen oder den Fehler mit dem Header. Also wenn man die Funktion thumb->output aufruft, dann sendet php die Daten als Bild. Aber der Browser denkt es kommt nur Text. Deswegen steht da sowas unverständliches 

Um das Bild nun auszugeben musste das so machen.

```
<?php
//in die Ausgabedatei das hier schreiben
?>
<img src="test.php">
<?php
```

und nun kommt eben *diese* _test.php_


```
<?php
include("class.thumb.php"); // oder was auch immer 
$thumb = new thumb(); // Klasseninstanz erstellen 
$thumb->create("test.jpg", 320, 240); // Thumbnail erstellen 
$thumb->output(); // Bild an den Browser ausgeben 
$thumb->clear(); // Aufräumen
?>
```
Nun sollte das richtige bild angezeigt werden.

Nun werden die Daten, die das Script sendet als Bilddaten gesehen und nicht mehr als Text.


----------



## KoMtuR (13. Juli 2004)

@reima

Also ich hab mir mal dein Skript angeschaut und ein was versteh ich logisch nicht 


```
<?php
      if ($width == 0) { 
            $width = round($height * ($src_width/$src_height)); 
        } 
        if ($height == 0) { 
            $height = round($width * ($src_height/$src_width)); 
        }
```

Also wenn eine Seitenangabe nicht gemacht wurde, müsste das Skript den Faktor berechnen, damit die Seitenverhältnisse gleich bleiben und keine _Verzerrung_ entsteht. Aber wie willst du denn den Faktor bestimmt , wenn du höhe/weite nimmst Also ich würde durch *(alte Höhe) / (neue Höhe)* oder eben *(alte Weite) / (neue Weite)* den Faktor bestimmt, inwieweit das Bild verkleinert wird. Dann bräuchte ich nurnoch das gesuchte Element mit diesem Faktor multiplizieren

Also so:

```
<?php
      if ($width == 0) { 
            $width = round($src_width * ($src_height/$height)); 
        } 
        if ($height == 0) { 
            $height = round($src_height * ($src_$width/$width)); 
        }
```

Bitte erklär mir mal deinen Gedankengang, wie du auf sowas kommst  Es funktioniert ja. Sonst hätte sich schon jemand beschwert.


----------



## Mako (13. Juli 2004)

Ok ich hab das jetzt mehr oder weniger hingebracht. Lokal geht zwar gar nichts obwohl die dll Datei da ist und in der php.ini auch richtig eingebunden, aber auf meinem Server klappts.

Jetzt habe ich allerdings ein Problem. Ich wollte das Ganze in eine Schleife hängen und mir so mehrer Bilder verarbeiten lassen. Leider macht er immer nur eines. Die Bilder sind alle in einem Verzeichnis und der Pfad wird per mysql aus einer Tabelle ausgelesen. Wie schaffe ich es nun, dass er mir die Bilder alle zu Thumbnails macht?

Rätselnde Grüße

Mako


----------



## Matthias Reitinger (13. Juli 2004)

@KoMtuR:

Mein Gedankengang:

Definiere (Breite / Höhe) als Seitenverhältnis.

Dann:
Breite = Höhe * (Breite / Höhe)
Breite = Höhe * Seitenverhältnis

Seitenverhältnis soll konstant bleiben. Für eine neue Höhe "neueHöhe" berechnet sich die zugehörte neue Breite dann wie folgt:

neueBreite = neueHöhe * Seitenverhältnis
neueBreite = neueHöhe * (Breite / Höhe)

Analog für die Berechnung der neuen Höhe bei gegebener neuer Breite.

So steht's dann auch in meinem Code 


Dein Gedankengang ist falsch, da du das Verhältnis mit (alteHöhe / neueHöhe) berechnest. Du brauchst aber den Anteil der neuen Höhe an der alten, also (neueHöhe / alteHöhe). Kannst du dir ganz einfach an einem Rechenbeispiel veranschaulichen: Nehmen wir mal an, neueHöhe = 0,5*alteHöhe. Dann wäre nach deiner Rechnung alteHöhe / neueHöhe = 2, und deine neue Breite dann neueBreite = alteBreite * (alteHöhe / neueHöhe) = 2*alteBreite! Richtig wäre aber natürlich 0,5*alteBreite, was mit meiner Rechnung aus rauskommt


----------



## KoMtuR (13. Juli 2004)

Naja ich glaub dir das schon. Ok ich hatte ein Denkfehler drin mit meiner Rechnung. Wollte das über die Strahlensätze machen, weil es das Thema waren, was wir immer zu dem Thema "Vergrößern und Verkleinern" hatten *fg*


----------

