Probblem mit ImageCopy()

  • Hi...
    Ich habe ein Probblem mit ImageCopy()...


    Ich möchte über ein vorhandenes PNG bzw. JPG einen weißen Balken setzen, der mit einem dynamischen Text gefüllt sein soll...


    ich wollte das ganze folgendermaßen angehen:

    • weißer Hintergrund, der 45 Pixel höher, als das Bild ist.
    • diesen dann mit dem Text füllen
    • zum Schluss das vorhandene Bild auf den erstellten Hintergrund kopieren und dann ausgeben


    das habe ich mit folgendem Code gemacht...
    PS: bin für Testzwecke von einer Bildgröße von 128x128Pixel ausgegangen



    das klappt aber leider nicht...


    wenn ich

    Code
    1. ImageCopy($img, $pic, 0, 45, 0, 0, 128, 128);


    auskommentiere, geht der Code insoweit, dass er den Hintergrund erzeugt...
    Ich schaffe es aber leider wirklich nicht, dass das Bild "pic.png" mit angezeigt wird.


    Grüße und danke im Voraus für euere Hilfe

  • ich hatte es so verstanden, dass der 2. Parameter bei ImageCopy (also $pic mit dem Inhalt pic.png) das bestehende Bild sein soll...
    ich hatte am Anfang des Scripts $pic = "pic.png"; stehen. Das ist das bestehende Bild (in diesem Beispielcode im selben Ordner. Später teilweise sogar auf einem anderen Server)


    Grüße YetiZWerg

  • Du übergibst ImageCopy einfach nur einen String, der den Namen des Bildes enthält.
    Das ist aber keine Ressource. Du musst das Bild also vorher einlesen und in $pic speichern.


    Ich kenne mich mit Bildfunktionen nicht aus, aber vielleicht funktioniert es mit readfile. Musst ausprobieren

    PHP
    1. <span class="syntaxdefault">$pic </span><span class="syntaxkeyword">= </span><span class="syntaxdefault">readfile</span><span class="syntaxkeyword">(</span><span class="syntaxstring">'pic.png'</span><span class="syntaxkeyword">); </span><span class="syntaxdefault"></span>
  • Hallo YetiZwerg,


    so funktioniert es - wenigsten bei mir. :)


    PHP
    1. <span class="syntaxhtml"><br /><br /><span class="syntaxdefault"><?php<br /><br />  header</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"Content-Type: image/png"</span><span class="syntaxkeyword">);<br /><br /></span><span class="syntaxdefault">  $src </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> imagecreatefrompng </span><span class="syntaxkeyword">(</span><span class="syntaxstring">"pic.png"</span><span class="syntaxkeyword">);<br /><br /></span><span class="syntaxdefault">  $width </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 128</span><span class="syntaxkeyword">;<br /></span><span class="syntaxdefault">  $height </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 128 </span><span class="syntaxkeyword">+</span><span class="syntaxdefault"> 45</span><span class="syntaxkeyword">;<br /><br /></span><span class="syntaxdefault">  $dst </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> imagecreatetruecolor</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$width</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $height</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  $black </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> ImageColorAllocate</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dst</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  $white </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> ImageColorAllocate</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dst</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 255</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 255</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 255</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  imagefill</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dst</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $white</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  imagestring</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dst</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 2</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 5</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 3</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">"Text"</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $black</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  imagecopy</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dst</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $src</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 45</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 128</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 128</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  imagepng</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dst</span><span class="syntaxkeyword">);<br /></span><span class="syntaxdefault">  imagedestroy</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$img</span><span class="syntaxkeyword">);<br /><br /></span><span class="syntaxdefault">?></span></span>
  • ok jetzt wird es kompliziert...


    das könnte ich ja einfach via if machen...


    aber... jetzt soll das ganze automatisiert geschehen...


    woher weiß ich, ob das jetzt ein png jpg oder gif ist...


    sry, wenn es dumm klingt, stehe da aber echt auf dem Schlauch...
    evtl denke ich auch einfach zu kompliziert aber ich komme mir echt vor, als stünde ich vor einer Wand

  • der Dateiname mit Pfad wird via Get übergeben...



    Es dreht dich darum, dass meine Freundin in einem Forum aktiv ist, wo sie u.a. Kleidung tauschen.
    Um das Bild gleich mit den wichtigsten Inhalten zu füllen (z.B. Größe usw.) wird auch das via Get übergeben und auf das Bild gepackt...


    zum einen hat es den Vorteil, dass es übersichtlicher wird und zum zweiten gibt es dann keine Missverständnisse mehr mit den anderen Usern, weil sie meinen, dass die Beschreibung zu ieinem anderen Artikel gehören

  • ja die ist schon da... aber ich weiß nicht, wie der script die auslesen kann


    ich würde den Pfad ja einfach an den Punkten teilen und dann so die Endung erhalten...


    Doch können die Dateien mitunter verschieden viele Punkte vor der Dateiendung haben...


    gibt es dafür keine Funktion??

  • Hallo YetiZwerg,


    Zitat

    Doch können die Dateien mitunter verschieden viele Punkte vor der Dateiendung haben...


    stimmt, nimm einfach alles was nach dem letzten Punkt kommt.


    Zitat

    gibt es dafür keine Funktion??


    Ich gkaube die mußt Du schon selbst schreiben.


    Mit diesen zwei PHP Funktionen sollte es kein Problem sein:


    PHP
    1. <span class="syntaxdefault">int strrpos </span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> string $haystack </span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> string $needle </span><span class="syntaxkeyword">[,</span><span class="syntaxdefault"> int $offset </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> 0 </span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)<br /></span><span class="syntaxdefault">string substr </span><span class="syntaxkeyword">(</span><span class="syntaxdefault"> string $string </span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> int $start </span><span class="syntaxkeyword">[,</span><span class="syntaxdefault"> int $length </span><span class="syntaxkeyword">]</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span>


    Versuch es mal.

  • Mit strstr sollte es möglich sein.


    Beispiel:

    PHP
    1. <span class="syntaxdefault"><br />if </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">true </span><span class="syntaxkeyword">===</span><span class="syntaxdefault"> strstr</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$pic</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">".png"</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">    $pic </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> imagecreatefrompng</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$pic</span><span class="syntaxkeyword">);<br />}<br /></span><span class="syntaxdefault">elseif </span><span class="syntaxkeyword">(</span><span class="syntaxdefault">true </span><span class="syntaxkeyword">===</span><span class="syntaxdefault"> strstr</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$pic</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">".jpg"</span><span class="syntaxkeyword">)</span><span class="syntaxdefault"> </span><span class="syntaxkeyword">{<br /></span><span class="syntaxdefault">    $pic </span><span class="syntaxkeyword">=</span><span class="syntaxdefault"> imagecreatefromjpg</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$pic</span><span class="syntaxkeyword">);<br />}<br /></span><span class="syntaxcomment">//weitere Dateitypen<br /></span><span class="syntaxdefault"> </span>


    Mit switch geht es natürlich kürzer, aber solange du das Prinzip verstanden hast.


    Sollten mehrere Punkte vorhanden sein, musst du es mit regulären Ausdrücken machen und nach dem letzten Punkt die Endung untersuchen.
    Kann ich dir auch gerne ein Beispiel schreiben, wenn du das möchtest.


    Edit: Der reguläre Ausdruck (einfach die if-Abfragen damit ersetzen):

    PHP
    1. <span class="syntaxdefault"></span><span class="syntaxkeyword">if (</span><span class="syntaxdefault">preg_match</span><span class="syntaxkeyword">(</span><span class="syntaxstring">"~\.png$~i"</span><span class="syntaxkeyword">) { </span><span class="syntaxcomment">//... } </span><span class="syntaxdefault"></span>


    Statt png kannst du natürlich auch nach anderen Endungen suchen

  • Hier habt ihr nochmal den Code, den ich bis jetzt erstellt habe:



    Jetzt habe ich neben er Dateiendung noch das Prob, dass vom unteren Ende des Bildes immer etwas abgeschnitten wird...


    Bei folgendem Bild wird über "Home" abgeschnitten...


    [Blockierte Grafik: http://streamboxgenerator.de/gen/header-logo.png]


    Grüße

  • &quot;YetiZwerg&quot; schrieb:

    Jetzt habe ich neben er Dateiendung noch das Prob, dass vom unteren Ende des Bildes immer etwas abgeschnitten wird...


    Du sagst ja auch mit

    PHP
    1. <span class="syntaxdefault">imagecopy</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dst</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$src</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">0</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">38</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">0</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">0</span><span class="syntaxkeyword">, </span><span class="syntaxstring">'173'</span><span class="syntaxkeyword">, </span><span class="syntaxdefault">$width</span><span class="syntaxkeyword">); </span><span class="syntaxdefault"></span>

    , dass nur eine Höhe von 173 Pixeln aus dem Bild kopiert werden soll.
    Hier muss, wie mit $width, die Höhe des zu kopierenden Bildes rein.

  • ja danke... ich idiot


    Habe jetzt zu folgendem Code geändert:


    Das Prob jetzt: er schneidet am unteren Ende des Bildes immernoch etwas ab...
    Dafür verlängert er den Hintergrund unter dem Bild

  • Hallo YetiZwerg,


    PHP
    1. <span class="syntaxdefault">imagecopy</span><span class="syntaxkeyword">(</span><span class="syntaxdefault">$dst</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $src</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 38</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> 0</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> </span><span class="syntaxstring">'173'</span><span class="syntaxkeyword">,</span><span class="syntaxdefault"> $width</span><span class="syntaxkeyword">);</span><span class="syntaxdefault"> </span>


    wie es scheint hast Du die beiden letzten Parameter vertauscht. Der letzte Parameter ist die Höhe und der vorletze die Breite.