imagecopyresampled

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • imagecopyresampled

    Hallo,
    ich habe ein kleines Skript, um mit imagecopyresampled ein Overlay über ein anders Bild zu legen und die beiden adaptiv zu verbinden.
    Das Overlay hat eine 90% Transparenz und soll über das Basisbild gelegt werden um eine Struktur zu simulieren. Im Großen und Ganzen funktionert das auch.
    Hier der Weg dazu.​
    PHP-Code:
    <?php
    class ImageManipulator {
        private 
    $baseImageFilePath// Path to the base image file
        
    private $overlayFilePath// Path to the overlay image file
        
    private $specialTransColor;

        public function 
    __construct($baseImageFilePath$overlayFilePath) {
            
    $this->baseImageFilePath $baseImageFilePath;
            
    $this->overlayFilePath $overlayFilePath;
            
    $this -> specialTransColor "236,42,144";
        }

        public function 
    initiateManipulation() {
            
    // Load the base image
            
    $baseImage imagecreatefrompng($this->baseImageFilePath);

            
    //Begin convert to 24bit
            //das baseImage ist ein 8bit Bild ohne Alpha Kanal, deshalb die Umwandlung in ein truecolor Bild
            
    imagepalettetotruecolor($baseImage);
            
    imagealphablending($baseImagefalse);
            
    imagesavealpha ($baseImagetrue);

            
    //Bild ist von 8bit auf 24bit (truecolor) konvertiert
            
    if(imageistruecolor($baseImage)){echo "<br>TrueColor: ja<br>";}else{echo "<br>TrueColor: nein<br>";}
            
    //End convert to 24bit


            // Load the overlay image
            
    $overlay imagecreatefrompng($this->overlayFilePath);

            
    // Check if the images were loaded successfully
            
    if (!$baseImage || !$overlay) {
                die(
    'Error loading the images.');
            }

            
    // Get the dimensions of the images
            
    $baseImageWidth imagesx($baseImage);
            
    $baseImageHeight imagesy($baseImage);
            
    $overlayWidth imagesx($overlay);
            
    $overlayHeight imagesy($overlay);

            
    // Apply the overlay image to the base image
            
    imagecopyresampled(
                
    $baseImage,
                
    $overlay,
                
    0,
                
    0,
                
    0,
                
    0,
                
    $baseImageWidth,
                
    $baseImageWidth,
                
    $overlayWidth,
                
    $overlayHeight
            
    );

            
    // Generate a temporary file name
            //$tempFileName = 'temp_image.jpg';
            
    $tempFileName 'temp_image.png';

            
    // Save the result image temporarily
            //imagejpeg($baseImage, $tempFileName);
            
    imagepng($baseImage$tempFileName);

            
    // Free up memory used by the images
            
    imagedestroy($baseImage);
            
    imagedestroy($overlay);

            
    // Generate a unique cache buster string
            
    $cacheBuster uniqid();

            
    // Display a success message and show the updated image
            //echo 'The image was created successfully, and the base image was updated: <img src="'.$this->baseImageFilePath.'?'.$cacheBuster.'" alt="Resulting Image" />';
            
    echo 'The image was created successfully, and the base image was updated: <img src="'.$tempFileName.'?'.$cacheBuster.'" alt="Resulting Image" width="1000px"/>';
        }
    }

    // Example usage
    $baseImageFilePath 'base_image2.png';
    $overlayFilePath 'overlay4.png';


    $imageManipulator = new ImageManipulator($baseImageFilePath$overlayFilePath);
    $imageManipulator->initiateManipulation();

    ?>
    Dieses Skript funktioniert mit zwei Bildern, die ich im Corel erstellt habe. Ein Foto als Basis und ein Overlay mit einer Transparenz (90%). Beide Bilder sind 24bit PNG
    Nun soll aber das Ganze innerhalb eine größeren Anwendung erfolgen. In dieser werden mehrere Teilbilder wieder zu einem zusammengesetzt und weiter manipuliert.
    Da werden Transparenzen gesetzt und entfernt, Filter angewendet, Farben getauscht und so weiter. Am Schluss habe ich ein GdImage object, welches ich als PNG speichere. Auch das funktioniert.

    Nun möchte ich aber auf dieses erstellte Bild ein Overlay legen. Deshalb der oben genannte Code.
    Leider funktioniert es da mit dem GdImage object nicht. Die Bilder werden zusammengelegt aber das Overlay liegt ohne Transparenz auf dem Basisbild.
    Also habe ich mir das zum Test vereinfacht. Ich habe das manipulierte Bild aus der großen Anwendung erst einmal gespeichert und nutze dieses Bild jetzt als Basisbild in der oben genannten Klasse.

    Aber da funktioniert es auch nicht. Das Overlay liegt auch da ohne Transparenz einfach über dem Basisbild. Nehme ich aber das aus Corel als PNG gespeichertes Foto funktioniert es wieder.
    Nun habe ich bereits herausgefunden, das es ein Problem gibt, wenn das Basisbild keine 24bit und somit auch keinen Alpha-Kanal hat. Mein Basisbild, welches ich mit PHP erstelle hat aber eben nur 8bit.
    Das liegt an den Anforderungen der vorhergehenden Funktionen. Das ist auch nicht änderbar.
    Ich habe auch schon mit imagealphablending($baseImage, false) und imagesavealpha ($baseImage, true) für beide Bilder versucht, das zu ändern. Funktioniert aber auch nicht.

    Wenn ich also dieses, von meiner Anwendung erstellte, Bild im Corel öffne und als 24bit einfach nur wieder abspeichere funktioniert alles, so wie es soll.
    Leider kann ich aber in der Webanwendung ja zwischendurch nicht mal einfach auf Corel zugreifen.

    Wie kann ich das 8bit Bild aus meiner Web-Anwendung in ein 24bit Bild mit Alpha-Kanal umwandeln, bzw. wo liegt mein Fehler?

    Das Skript kann man hier mit allen Bildern downloaden: https://download.psygonis.de/test.rar​

  • #2
    Fehler gefunden.
    statt
    PHP-Code:
    imagepalettetotruecolor($baseImage);
            
    imagealphablending($baseImagefalse);
            
    imagesavealpha ($baseImagetrue);​ 
    muss es heißen
    PHP-Code:
    imagepalettetotruecolor($baseImage);
            
    imagealphablending($baseImagetrue); 

    Kommentar


    • #3
      Schon ziemlich spezielles Wissen was du da abfragst^^
      Aber vielen Dank, dass du uns an der Lösung teilhaben lässt!

      Kommentar

      Lädt...
      X