Du bist nicht angemeldet.

PHP/MySQL ImageResize-Klasse

Lieber Besucher, herzlich willkommen bei: WebStyleBoard. Falls dies dein erster Besuch auf dieser Seite ist, lies bitte die Hilfe durch. Dort wird dir die Bedienung dieser Seite näher erläutert. Darüber hinaus solltest du dich registrieren, um alle Funktionen dieser Seite nutzen zu können. Benutze das Registrierungsformular, um dich zu registrieren oder informiere dich ausführlich über den Registrierungsvorgang. Falls du dich bereits zu einem früheren Zeitpunkt registriert hast, kannst du dich hier anmelden.

1

Donnerstag, 17. März 2005, 08:55

ImageResize-Klasse

Momentan versuche ich gerade das mit OOP und Class und so zu schnallen. Deshalb hab ich mal spasseshalber eine Klasse zum Erstellen von Vorschaubildern gebaut. (ich hatte diese Funktion vorher als eine Funktion. Ich weiss das dies nix weltbewegendes ist und es solche Sachen wie Sand am Meer gibt ... aber hier geht es darum, mich weiterzuentwickeln und zu neuen Ufern aufzubrechen :)

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
class resizer{
 var $imgDatei;
 var $imgBreit;
 var $imgHoch;
 var $imgRatio   1;
 var $imgQuality 95;
 var $imgData;
 var $newHoch;
 var $newBreit;
 
 function set_breit($breit){
     $this->imgBreit $breit;
 }
 function set_hoch($hoch){
     $this->imgHoch $hoch;
 }
 function set_ratio($ratio){
     $this->imgRatio $ratio;
 }
 function set_quality($r){
     $this->imgQuality $r;
 }
 function set_datei($datei){
     $this->imgDatei $datei;
     if(!file_exists($datei))$this->is_error("Die Datei '".$this->imgDatei."' existiert nicht.");
     $this->set_data($this->imgDatei);
 }
 function set_data($datei){
     $this->imgData getimagesize($this->imgDatei);
     if($this->imgData[2] != && $this->imgData[2] != && $this->imgData[2] != 3)
         $this->is_error("Die Datei hat kein erlaubtes Dateiformat (jpg,gif,png)");
     // $this->imgData[0] - Breite
     // $this->imgData[1] - Höhe
     // $this->imgData[2] - Typ gif etc
 }
 
 function set_newdata(){
  if($this->imgRatio == 1){
   if( $this->imgData[0] >= $this->imgData[1] ){
     $this->new_breit  $this->imgBreit;
     $this->new_hoch   abs($this->imgData[1] * $this->new_breit $this->imgData[0]);
   }
   if( $this->imgData[0] < $this->imgData[1] ){
     $this->new_hoch   $this->imgHoch;
     $this->new_breit  abs($this->imgData[0] * $this->new_hoch $this->imgData[1]);
   }
   }else{
   $this->new_breit  $this->imgBreit;
   $this->new_hoch   $this->imgHoch;
   }
 }
 function get_resize($dateiname ""){
 $this->set_newdata();

 if($this->imgData[2]==1)$vorlage   imagecreatefromgif($this->imgDatei);
 if($this->imgData[2]==2)$vorlage   imagecreatefromjpeg($this->imgDatei);
 if($this->imgData[2]==3)$vorlage   imagecreatefrompng($this->imgDatei);

 $new_bild imagecreatetruecolor($this->new_breit$this->new_hoch);
 imagecopyresampled($new_bild,$vorlage,0,0,0,0,$this->new_breit,$this->new_hoch,$this->imgData[0],$this->imgData[1]); // Das geladene Bild auf Thumbnailgröße verkleinern

 if($this->imgData[2]==1)imagegif($new_bild,$dateiname);
 if($this->imgData[2]==2)imagejpeg($new_bild,$dateiname$this->imgQuality);
 if($this->imgData[2]==3)imagepng($new_bild,$dateiname);

 ImageDestroy($vorlage);
}
 
 function is_error($msg){
     echo "<big>Es ist ein Fehler aufgetreten</big><br />";
     echo $msg;
     die();
 }
 
}


benutzt wird die sache dann so:

PHP-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
// Klasse initialisieren
$img = new resizer();

// Breite des neuen Bildes festlegen, wenn Breite > Höhe bei ratio = 1
$img->set_breit(150);

// Höhe des neuen Bildes festlegen, wenn Breite < Höhe bei ratio = 1
$img->set_hoch(100);

// Ratio 1 für an und 0 für aus
// 1 = Bild wird proportional geändert, also nicht verzerrt
// 0 = Bild wird mit den oben angegebenen Maßen erstellt
$img->set_ratio(1);

// Qualität des neuen Bildes (nur JPG) 0-100
$img->set_quality(95);

// Pfad zum Orginalbild
// Resize von .gif funktioniert erst mit der neuesten GD-Version (2.0.28 glaube)
$img->set_datei("temp/388665.jpg");

// Starte den Vorgang

// Das neue Bild wird direkt ausgegeben
$img->get_resize();

// Das neue Bild wird als $filename gespeichert
//$img->get_resize($filename);


so dele

PS: Vorschläge für eine eventl. sinnvollere OOP bitte unbedingt hier loswerden. Ich habe leider immer noch so meine Schwierigkeiten mit dem Verstehen von OOP.
Signatur von »TheNobody Style«

2

Donnerstag, 17. März 2005, 13:46

Da du schon danach fragst! ;) ...
OOP ist ja quasi mein zweiter Vorname ;) ...

Dummerweise ist php meiner Meinung nicht gerade die ideale Plattform, um OOP zu lernen... vor allem dann nicht, wenn man jahrelang php bereits genutzt hat und dann auf einmal OOP m achen will. Bei anderen Sprachen geht das halt gar nicht anders und dadurch bekommt man dann auch irgendwann das schöne dieses Paradigmas zwangsläufig mit und fängt an objektorientierter zu denken (obwohl man das im Alltag ja bereits tut - aber wenn man erstmal imperativ programmiert wird das schwieriger *g*).

Also grundsätzlich ist OOP ja deswegen sinnvoll und auch mächtig, wenn man mehrere Klassen hat, die untereinander kommunizieren! Also die Abhängigkeiten, Assoziationen, Verfeinerungsbeziehungen zwischen einzelnen Klassen und letztlich zwischen mehreren Objekten dieser Klassen...
Bei deinem Beispiel gibt es kein solches Beziehungsgeflecht - was natürlich bei der Anwendung auch nicht notwendig ist! Weswegen sich dein Beispiel prinzipiell auf die Modularität beschränkt... im Prinzip hast du also nichts anderes als eine Funktionssammlung erzeugt ;) ... also eine Arbeitserleichterung, die aber grundsätzlich nur soviel mit OOP zu tun hat, als dass du eine Klasse benutzt hast. Aber immerhin - ein löblicher Ansatz sich mit dem Thema zu beschäftigen! Und man muss ja nu auch erstmal klein anfangen... und wie gesagt: mit php ist dieser Anfang nicht wirklich zwingend ;)
Ich habs selbst schon ausprobiert vor einiger Zeit und bin nicht wirklich weit gekommen, weil die Sprache einfach zu wenig Features mit sich bringt... php5 hat da etwas aufgeholt.

Zu dem Programm an sich:
Es gibt Felder (die vars) denen du sog. Modifier-Methoden spendiert hast: get+set Methoden. Dabei hast du allerdings ne kleine Konvention verletzt und zwar die sog. Seiteneffektfreiheit von lesenden Methoden. Eine get-Methode ist dafür da, dass man die "privaten" Felder von außen auslesen kann. Bei php4 macht diese get-Zugriffs-Geschichte keinen Sinn, weil man eben einfach direkt auf die Felder zugreifen kann - dies ist aber nicht unbedingt das, was man möchte... deine get-Methode get_resize hat keinen return Wert und verändert den internen Zustand des Objekts. Eine get-Methode bei OOP ist aber grundsätzlich per Konvention so definiert, dass lediglich ein Feld ausgelesen wird und zurückgegeben wird (sprich das fertige Bild wird returned)... dieses returnen fehlt - stattdessen wird direkt ein Bild erzeugt... nenns doch einfach createImageFile oder so... ;)

Objektorientierter wäre es gewesen, wenn du zunächst erstmal ne Klasse Picture hättest... evtl. gibt es ja ne Idee, verschiedenartige Bilder zu speichern... und dann machste ne Resize-Klasse, denen man Bilder hinzufügen kann - also die eine Methode anbietet, deren Argument vom Typ Picture ist - und je nach Picture-Typ (Oberklasse Picture, mehrere abgeleitete Unterklassen) werden entsprechend andere Resize-Funktionalitäten genutzt...
Da wäre dann die oben angesprochene Kommunikation einzelner Objekte untereinander ;)

Das Beispiel ist jetzt leider etwas dahergeholt, weil ich mir jetzt auch nicht versch. Bildtypen vorstellen kann (es sei denn Resize funktioniert z.B. bei Jpegs anders als bei Gifs oder pngs, oder was auch immer *g*) - aber ich wollt jetzt auch kein komplett neues herzaubern!

Hoffe du konntest mit meinem Geschreibsel was anfangen ;) - zu rückfragen bin ich gerne bereit antwort zu geben ;)

Ich wollte ja auch schonmal nen Tutorial für OOP schreiben - leider haben mich dann aber die Einschränkungen von PHP doch davon abgehalten.
Signatur von »Snoop« The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offence.
-- Edsger W. Dijkstra, SIGPLAN Notices, Volume 17, Number 5 (11.05.1930 - 07.08.2002)

3

Donnerstag, 17. März 2005, 13:49

Kleine Nebenfrage an Snoop: Welche Sprache würdest Du vorschlagen? Perl? Java?
Signatur von »LapisInfernalis« Eine Milde Gabe...

Der Horizont vieler Menschen ist ein Kreis mit dem Radius Null - und das nennen sie ihren Standpunkt.

Albert Einstein (1879-1955)

A common mistake people make when trying to design something completely foolproof is to underestimate the ingenuity of complete fools.
Douglas Adams (1952-2001)

4

Donnerstag, 17. März 2005, 14:03

OOP hin oder her - ich wuerde mich mal fuer eine sprache entscheiden ;)

(set_hoch, set_breit, quality, resize, get_datei...)

oder ein paar neue methoden einfuehren (reziser->new_image(width, height[, depth[,quality]]))
Signatur von »HoRnominatoR« "setz dich hin, trink ein glas wasser und warte auf deinen feierabend"

get OPERA for free

5

Donnerstag, 17. März 2005, 14:20

Zitat von »HoRnominatoR«

ich wuerde mich mal fuer eine sprache entscheiden ;)

das darfst du natürlich gern tun :P
mir geht es eher um einen Kompromiss kurz und zurechtfinden

Zitat

oder ein paar neue methoden einfuehren (reziser->new_image(width, height[, depth[,quality]]))

Das könnte man tun, aber dies war für mich nicht Sinn der Übung. Ausserdem kann ich nicht sagen, dass ich selber neue Methoden für diese Klasse brauchen würde. Daher auch keinen Grund, um neue einzuführen. ;)

@snoop
Das mit "get" macht natürlich Sinn :-)

Zitat

Objektorientierter wäre es gewesen, wenn du zunächst erstmal ne Klasse Picture hättest ... usw.

Verstehe ich da den Sinn richtig:
In der Klasse PICTURE wären dann die Methoden set_datei() und set_data() und in der RESIZE der ganze Rest?

// Mir geht es hier eher um das Verstehen der Materie ... brauchen tu ich es im Progger-Alltag eher weniger bzw. lediglich im Rahmen solcher Klassen, die ich eventl. öfter mal gebrauchen kann.
Signatur von »TheNobody Style«

6

Freitag, 18. März 2005, 12:03

Die Klasse picture sollte Methoden enthalten,die für das Laden und Speichern von Bildern zuständig sind. Metohoden zum Lesenund Schreiben der Imageressource wären auch gut
Dabei kannst du auch eine abstrakte Klasse picture definieren und die Methden erst in den davon abgeleiteten Klassen picture_jpg, picture_gif, picture_png, ... implementieren

Die Klasse resize erwartet eine Imageressource und ändert die Größe des sich dahinter verbergenden Bildes.
Sie sollte eine Imageressource zurückliefern.

Diese Imageressource übergibst du an deine picure-Klasse und speicherst das ganze


[ot]Nur mal so angedacht[/ot]

btw:
Schreib doch ein objektorientiertes Gästebuch
Klassen:
Gästebuch
Eintrag
Verfasser

Zum Speichern desselbigen:
Eine Klasse store_gb
und davon abgeleitet store_gb_db und store_gb_flatfile zum Beispiel

Die beiden letztgenannten Klassen besitzen exakt die gleiche Methoden. Duerzeugst ein Objekt einer dieser beiden Klassen und gibst es der Gästebuchklasse als referenz mit.
Dadurch, dass die Methoden gleich lauten, kannst du ein Gästebuch ganz einfach in einer Datenbank speichern oder in einer textdatei
Signatur von »mrhappiness« Ich denke, also bin ich. Einige sind trotzdem...

7

Freitag, 18. März 2005, 12:23

@Lapis: Da Java sicherlich die Sprache ist, die ich am besten kann, werd ich hier natürlich auch Java vorschlagen ;) ... andere Sprachen sind aber natürlich genauso gut. Perl würde ich nicht vorschlagen - bislang war Perl für mich nicht wirklich objektorientiert.
Ne gute Alternative ist inzwischen C# (sieht syntaktisch Java unheimlich ähnlich!) und das .Net Framework geworden. Damit kann man inzwischen auch schöne Webanwendungen basteln...
C++ hat meiner Meinung nach zu viele Konzepte, die mir zu systemnah sind... Pointer-Verbiegungen, Templates können sehr typunsichere dinge tun, etc.
Also zum schlichten lernen von OOP eignet sich Java vermutlich ganz gut, weil eine ziemlich umfangreiche Klassenbibliothek dabei ist, mit der man schon eigentlich alles machen kann - genauso wie bei .Net... weil meistens will man beim Lernen ja auch möglichst was anfassbares am Ende haben.

@TNS: Jein... mir kommts so vor, als ob du OOP bislang eher als Möglichkeit ansiehst, modular Programme zu schreiben. Das ist natürlich ein Vorteil, aber längst nicht alles. Objektorientiertheit macht erst dann Sinn, wenn man beim Entwerfen oder beim Analysieren des Problems auch Objekte ausmachen kann. Sprich, was muss ich machen, ach ich hab irgendwie Bilder und die will ich anpassen. Wenn man dabei feststellt, dass man dabei noch verschiedene Typen von Bildern hat, kommt man zu nem weiteren OOP-Prinzip: Vererbung. Dummerweise kann ich mir bei deiner Problemstellung, dem "Resizen" von Bildern, auch nicht so wirklich Objekte überlegen... das einzige was mir eingefallen ist, war halt das mit den versch. Typen. Allerdings macht das wohl vermutlich keinen Sinn, weil JPEG-Bilder vermutlich genauso veränderbar sind wie PNGs oder ähnliches *g*...
Vielleicht mal nen anderes Beispiel:
User-System ;) ... sehr typische Sache... man stelle sich vor, man hat eine Klasse WebPortal. Das ist im Prinzip die "Anwendungs-Klasse". Dann hat man eine weitere Klasse User als Oberklasse von mehreren Typen von Usern. Dann gibt es z.B. ne Klasse Standard-User, Admin, Guest usw... in denen man hauptsächlich Daten packt und verschiedene Methoden definiert, die Benutzer normalerweise auf dem WebPortal so tun dürfen. Diese Methoden sind alle in der Oberklasse bereits enthalten (also z.B. sowas wie postMessage, changeName, deleteUser, etc...). In der Oberklasse sind diese Methoden aber noch nicht implementiert (sind einfach leer gelassen). In "vernünftigen" OOP-Sprachen könnte man diese Klasse dann "abstract" definieren, was bedeutet, dass man keine Instanzen dieser Klasse erzeugen kann (will man auch gar nicht), sondern lediglich von dieser Klasse erben darf und die Verpflichtung hat, dass sämtliche als abstract definierte Methoden der Oberklasse von den Unterklassen überschrieben werden müssen. Überschreiben heißt dabei einfach, dass die Unterklassen halt auch alle changeName, deleteUser etc. implementieren müssen.
Soo - warum ist das jetzt nen Vorteil ;) ... ganz einfach. Man stelle sich jetzt mal vor es gab Möglichkeiten Benutzer zu generieren (also irgendwelche Menschen können sich am System anmelden und das System entscheidet dann, welcher Klasse von Benutzern derjenige zugewiesen wird... also man hat Standard-User, Admins etc...). Wenn der Kerl sich also jetzt beim System anmeldet, wird ein entsprechendes User-Objekt erzeugt, z.B. nen Objekt der Klasse Standard-User. Das WebPortal hält dann eine Referenz (bzw. eine ganze Liste von Referenzen) vom Typ User (der abstrakten Oberklasse), sodass diese Liste sämtliche Usertypen beinhalten kann! Das heißt nach außen hin gibt es nur noch Objekte vom Typ User! Aber die Unterklassen implementieren die gleiche Schnittstelle wie die Oberklasse! Das ist der Knackpunkt. Wenn jetzt das Webportal ne Möglichkeit bietet einen User zu löschen (irgendnen Knopp halt) und der Normale User clickt darauf, dann wird von der aktuellen Klasse des Users die Methode deleteUser() aufgerufen. Diese ist dann je nachdem ob er Admin ist, Standard-User oder wasauchimmer anders implementiert. Nämlich beim Standard-User kommt ne Fehlermeldung: "Datt darfst du nich du Horst!" während beim Admin dann sowas kommt wie "Willst du den wirklich rausschmeißen?" und dann das Löschen tatsächlich durchzieht...
Dieses Prinzip, dass je nach Unterklassen-Typ eine unterschiedliche Implementierung derselben Methode ermöglicht wird, nennt man auch Polymorphie und ist imho das zentrale Konzept bei OOP. Es ermöglicht nämlich eine unheimlich flexible Programmierweise. Wenn man irgendwann auf die Idee kommen sollte und noch weitere Usertypen hinzuzufügen, muss man lediglich ne weitere Klasse von User erben lassen und schwupp - geht das ;) ... bei Herkömmlicher Programmierweise, würde man an zich Stellen Fallunterscheidungen (if,thens) einbauen müssen. Das ganze ermöglicht dann wirklich Wiederverwendbarkeit...

Was du gemacht hast mit deiner Klasse ist im Prinzip ne Art Toolkit oder Sammlung von Funktionalität mit leichterem Zugriff. Du hättest das ganze dann aber auch einfach als Funktionssammlung herkömmlichen Stils bauen können... solche Toolklassen sind aber natürlich durchaus üblich auch bei OOP ;) ... insb. wenn es um bestimmte Berechnungen geht. So ist die Klasse Math unter Java so ein Beispiel... die bietet dann sowas wie Sinus oder E-Funktion an...

Also letztlich ... OOP lohnt sich wirklich - aber wie gesacht, unter PHP ist das so ne Sache... php5 bietet da schon mehr, aber so richtig glücklich bin ich damit auch noch nicht ;) - hab mich damit aber auch noch nicht soo beschäftigt.

Edit: Da ist mir der mrhappiness mit einem sehr viel anschaulicheren Beispiel zuvorgekommen ;)
Signatur von »Snoop« The use of COBOL cripples the mind; its teaching should, therefore, be
regarded as a criminal offence.
-- Edsger W. Dijkstra, SIGPLAN Notices, Volume 17, Number 5 (11.05.1930 - 07.08.2002)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Snoop« (18. März 2005, 12:26)


8

Freitag, 18. März 2005, 18:58

Hier mal so eine Frage am Rande:

Zeile 30:

PHP-Quelltext

1
     if($this->imgData[2] != && $this->imgData[2] != && $this->imgData[2] != 3)


Woher weis PHP, dass es sich um jpg, gif oder png handeln muss?

9

Freitag, 18. März 2005, 21:34

kannst du mit getimagesize() rausbekommen

http://de.php.net/manual/de/function.getimagesize.php
Signatur von »HoRnominatoR« "setz dich hin, trink ein glas wasser und warte auf deinen feierabend"

get OPERA for free

10

Samstag, 19. März 2005, 03:48

Ups, OK, thx :)

Zurzeit ist neben dir 1 Benutzer in diesem Thema unterwegs:

1 Besucher