Hackerboard Wiki HaboBlog
Hackerboard bei Facebook Hackerboard bei Google+ Hackerboard bei Twitter

[HaBo]

 
(Web-) Design und webbasierte Sprachen Tipps & Tricks, Designabgleich, HTML & Javascript, Flash, ASP, PHP, Perl/CGI...

Dynamisches generieren von Bildern + Wasserzeichen

Diskussion: Dynamisches generieren von Bildern + Wasserzeichen im Forum (Web-) Design und webbasierte Sprachen, in der Kategorie Web, Network & Multimedia Palace; Anzeige Guten Tag zusammen, ich hab folgendes gecodet: PHP-Code: <?php header ( 'Content-type: image/jpeg' ); require( '../conf/functions.inc' ); /**  * Gallerieordner  */  ...

Antwort
Alt 25.05.08, 16:26   #1 (permalink)
 
Benutzerbild von reaLInsanity
 
Registriert seit: 10.01.06
reaLInsanity Leistung: Facit NTK
reaLInsanity eine Nachricht über ICQ schicken reaLInsanity eine Nachricht über AIM schicken reaLInsanity eine Nachricht über Yahoo! schicken
Likes: 0
Standard Dynamisches generieren von Bildern + Wasserzeichen

Anzeige

Guten Tag zusammen,
ich hab folgendes gecodet:

PHP-Code:
<?php
header
('Content-type: image/jpeg');
require(
'../conf/functions.inc');

/**
 * Gallerieordner
 */ 
$dir '../images/gallery/';

/**
 * Pfad zum Wasserzeichen
 */ 
$watermark '../images/gallery/watermark.png';

 
/**
 * Skalierungsfaktor
 */ 
$ScaleFactor xyz;

/**
 * Dateinamenerweiterung rausfinden
 */ 
 
function getExt($str)
{
    return 
strtolower(substr($strstrrpos($str'.') + 13));
}

// Sonderzeichen alá Leerzeichen am Anfang und Ende der übergebenen Variablen löschen
$reqDir trim($_REQUEST['dir']);
$reqImg trim($_REQUEST['img']);

// Prüfen, ob Datei existiert und dann Imageresourcen erstellen
if(file_exists($dir $reqDir '/' $reqImg))
{
    switch(
getExt($reqImg))
    {
        case 
'gif':
            
$imgSrc imagecreatefromgif($dir $reqDir '/' $reqImg);
            break;
        case 
'jpg':
            
$imgSrc imagecreatefromjpeg($dir $reqDir '/' $reqImg);
          break;
      case 
'png':
          
$imgSrc imagecreatefrompng($dir $reqDir '/' $reqImg);
           break;
       default:
           
trigger_error('Bildformat wird nicht unterstützt'E_USER_WARNING);
           break;
    }
}
// Verfahre mit Wasserzeichen ebenso
if(file_exists($watermark) && is_readable($watermark))
{
    switch(
getExt($watermark))
    {
        case 
'jpg':
            
$imgWm imagecreatefromjpeg($watermark);
          break;
      case 
'png':
          
$imgWm imagecreatefrompng($watermark);
           break;
       default:
           
trigger_error('Bildformat wird nicht unterstützt'E_USER_WARNING);
           break;
    }
}
// Breite und Höhe der Bilder ermitteln
$imgSrcWidth     imagesx($imgSrc);
$imgSrcHeight     imagesy($imgSrc);
$imgWmWidth     imagesx($imgWm);
$imgWmHeight     imagesy($imgWm);

// Skalierung
$scaledwidth    $imgSrcWidth;            
$scaledheight    $imgSrcHeight;

// Neues Bild erstellen
$img imagecreatetruecolor($scaledwidth$scaledheight);

// Bild in das Neuerstellte einfügen
imagecopy($img$imgSrc0000$scaledwidth$scaledheight);

// Wasserzeichen einfügen
imagecopy($img$imgWm$scaledwidth $imgWmWidth$scaledheight $imgWmHeight00$imgWmWidth$imgWmHeight);

imagejpeg($img); // JPEG erstellen
imagedestroy($img); // JPEG löschen
?>
Jedoch möchte ich noch eine Skalierung einbauen, ich bekomme es aber überhaupt nicht hin. Wäre nett wenn mir einer da helfen könnte.

Über Tipps, hinsichtlich Performance o.Ä. würde ich mich auch freuen
reaLInsanity ist offline   Mit Zitat antworten
Alt 26.05.08, 18:30   #2 (permalink)
 
Benutzerbild von rami
 
Registriert seit: 09.02.08
rami Leistung: Facit NTK
rami eine Nachricht über ICQ schicken rami eine Nachricht über Skype™ schicken
Likes: 0
Standard

Ich versteh das Problem nicht ganz. Oder hilft dir imagecopyresized/imagecopyresampled?
__________________
rami ist offline   Mit Zitat antworten
   
HaBOT
 
- Anzeige -

Werbung ist gerade online    
Alt 26.05.08, 18:55   #3 (permalink)
Themenstarter
 
Benutzerbild von reaLInsanity
 
Registriert seit: 10.01.06
reaLInsanity Leistung: Facit NTK
reaLInsanity eine Nachricht über ICQ schicken reaLInsanity eine Nachricht über AIM schicken reaLInsanity eine Nachricht über Yahoo! schicken
Likes: 0
Standard

ja shcon würde es mir helfen nur ich seh vor lauter Bäumen den Wald nciht mehr ôo
reaLInsanity ist offline   Mit Zitat antworten
Alt 26.05.08, 19:44   #4 (permalink)
 
Benutzerbild von rami
 
Registriert seit: 09.02.08
rami Leistung: Facit NTK
rami eine Nachricht über ICQ schicken rami eine Nachricht über Skype™ schicken
Likes: 0
Standard

Ich habe es selber auch nur mit rumtesten benutzt, was ich hier schreibe ist NICHT GETESTET UND ALLE ANGABEN SIND OHNE GEWÄHR!
PHP-Code:
int imagecopyresized resource $dst_im resource $src_im int $dstX int $dstY int $srcX int $srcY int $dstW int $dstH int $srcW int $srcH 
$dst_im = Das mit imageCreate erzeugte leere Bild
$src_im = Die Bildquelle (mit imagecreatefrompng erstellt)
$dstX/$dstY = Position im Zielbild
$srcX/$srcY = Obere Ecke des Ausschnitts von einzufügenden Bild
$dstW/$dstH = Größe des einzufügenden Bilds im Zielbilds
$srcW/$srcH = Größe des Ausschnitts von einzufügenden Bild
__________________
rami ist offline   Mit Zitat antworten
Alt 27.05.08, 20:48   #5 (permalink)
Themenstarter
 
Benutzerbild von reaLInsanity
 
Registriert seit: 10.01.06
reaLInsanity Leistung: Facit NTK
reaLInsanity eine Nachricht über ICQ schicken reaLInsanity eine Nachricht über AIM schicken reaLInsanity eine Nachricht über Yahoo! schicken
Likes: 0
Standard

hm ich bekomsm einfach zum verrecken nicht hin das Bild zu skalieren >.<
reaLInsanity ist offline   Mit Zitat antworten
Alt 27.05.08, 23:57   #6 (permalink)
Member of Honour
 
Benutzerbild von beavisbee
 
Registriert seit: 22.02.07
beavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium IIIbeavisbee Leistung: Pentium III
beavisbee eine Nachricht über ICQ schicken
Likes: 77
Standard

ich hab mal in meinen alten Scripten gewühlt und noch bissl durchkommentiert...

PHP-Code:
<?

//Oh man, auf was fuer Ideen ich alles kam, als ich noch keine regulären Ausdrücke beherrscht hab... :-)
function filename_base($file)
{
    
//    Gibt den Dateinamen ohne Dateiendung zurueck
  
$f=explode(".",$file);
  
$ret="";
  for(
$i=0;$i<(sizeof($f)-1);$i++)
  {
    if(
$ret!=""){$ret.=".";}
    
$ret.=$f[$i];
  }
return 
$ret;
}

//noch ein Exemplar von "Oh man, auf was fuer Ideen ich alles kam, als ich noch keine regulären Ausdrücke beherrscht hab..." :-)
function filename_ext($file)
{
    
//    Gibt die Dateiendung einer Datei zurueck
  
$f=explode(".",$file);
  return 
$f[sizeof($f)-1];
}


//Bildverkleinerungsfunktion
function thumb($file$save$width$height$prop TRUE)
{
    
$ret=true;
    
// Requires GD-Lib > 2.0
    // Ist $prop=TRUE, so werden die Proportionen des Bildes
    // auch in der verkleinerten Version eingehalten
    
@unlink($save);
    
$infos = @getimagesize($file);
    if(
$prop)
    {
        
// Proportionen erhalten
        
$iWidth $infos[0];
        
$iHeight $infos[1];
        
$iRatioW $width $iWidth;
        
$iRatioH $height $iHeight;
        if (
$iRatioW $iRatioH)
        {
            
$iNewW $iWidth $iRatioW;
            
$iNewH $iHeight $iRatioW;
        }
    else
    {
            
$iNewW $iWidth $iRatioH;
            
$iNewH $iHeight $iRatioH;
        }
    }
    else
    {
        
// Strecken und Stauchen auf Größe
        
$iNewW $width;
        
$iNewH $height;
    }


    if(
$infos[2] == 2)
    {
        
// Bild ist vom Typ jpg
        
$imgA imagecreatefromjpeg($file);
        
$imgB imagecreatetruecolor($iNewW,$iNewH);

        
imagecopyresampled($imgB$imgA0000$iNewW,
                           
$iNewH$infos[0], $infos[1]);

    
//Ziel-Format anhand der Dateinamen-Erweiterung
        
if(strtolower(filename_ext($save))=="jpg"){imagejpeg($imgB$save);}
        elseif(
strtolower(filename_ext($save))=="jpeg"){imagejpeg($imgB$save);}
        elseif(
strtolower(filename_ext($save))=="png"){imagepng($imgB$save);}

        
imagedestroy($imgA);
        
imagedestroy($imgB);

    }
    elseif(
$infos[2] == 3)
    {
        
// Bild ist vom Typ png
        
$imgA imagecreatefrompng($file);
        
$imgB imagecreatetruecolor($iNewW$iNewH);
        
imagecopyresampled($imgB$imgA0000$iNewW,
                           
$iNewH$infos[0], $infos[1]);

    
//Ziel-Format anhand der Dateinamen-Erweiterung
        
if(strtolower(filename_ext($save))=="jpg"){imagejpeg($imgB$save);}
        elseif(
strtolower(filename_ext($save))=="jpeg"){imagejpeg($imgB$save);}
        elseif(
strtolower(filename_ext($save))=="png"){imagepng($imgB$save);}

        
imagedestroy($imgA);
        
imagedestroy($imgB);

    }
    else
    {
        
$ret=false;
    }
    
return 
$ret;
}



//ANWENDUNG:
//=========================================================================
//da die Funktion thumb() bei zu starken Verkleinerungen (z.B. von 5 Megapixel auf 120x80px Thumbnail) irgendwo Mist baut (Division durch 0), hier ein kleiner WorkAround:

$bild="foo_bar.jpg";
$max=800; (groessere Seite des Bildes soll 800px groß sein)

$infos = @getimagesize($bild);
//prüfen, ob eine der beiden Seiten groesser als das gewuenschte Maximum ist
if($infos[1]>$max OR $infos[0]>$max)
{
    
//den groesseren der beiden Dimensions-Werte zur Berechnung nutzen
    
if($infos[1]>$infos[0]){$wert=$infos[1];}
    else{
$wert=$infos[0];}

    
$i=0//fuer Sicherungskopie - um festzustellen, ob die Schleife zum ersten Mal durchlaeuft
    //LANGSAMES RUNTER-SCHRUMPFEN
    
do
    {
        
//ich hab die Bilder immer nur um den Faktor 1.8 kleiner gemacht... man kann auch mehr mit einmal probieren... bei zu starker Verkleinerung verursacht die thumb()-Funktion jedoch eine Division durch Null
        
$wert=$wert/1.8;

        
//Wert, auf den skaliert werden soll - wenn der Wert durch Berechnung kleiner wird, als der Zielwert, dann setze ihn auf den Ziel-Wert 
        
if($wert<$max){$wert=$max;}

        
$orig=$bild;
        
$orig2=filename_base($bild)."_orig.".filename_ext($bild);
        
$cp=filename_base($bild)."_neu.".filename_ext($bild);
        if(
$i++==0){copy($orig,$orig2);} //beim ersten Durchlauf eine Kopie erstellen
        
else
        {
          if(
file_exists($orig2)){unlink($orig2);}
          
copy($cp,$orig2);
        }
        
thumb($orig2,$cp,$max,$max);
        
unlink($orig2);
    }
    while(
$wert>$max);
}

?>
beavisbee ist offline   Mit Zitat antworten
Antwort
   
- Anzeige -

Werbung ist gerade online    

[HaBo] » Web, Network & Multimedia Palace » (Web-) Design und webbasierte Sprachen » Dynamisches generieren von Bildern + Wasserzeichen
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind aus
Pingbacks sind aus
Refbacks sind aus


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Dynamisches Menü? :::Lük::: (Web-) Design und webbasierte Sprachen 11 25.07.09 01:42
C mehrdimensionales dynamisches Array marcotesoalli Code Kitchen 0 12.11.08 21:27
Geheimes Wasserzeichen im Forum? Daywalker (Web-) Design und webbasierte Sprachen 17 19.05.08 14:40
Dynamisches Feld (C++) Kenniej91 Code Kitchen 2 01.10.07 21:07
grafikbearbeitung für Komandozeile (wasserzeichen) flame Applikationen 2 02.06.07 12:52


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