Profil | Mitglieder | Registrieren | Start | Suche


PHP-Support.de » Programmierung » PHP & MySQL » imagecopyresampled    » Hallo Gast [Login | Registrieren]

Neues Thema | Antworten   

Autor Beitrag
Psygonis
Mitglied
Neuling


Dabei seit: 13.04.2023
Herkunft: Deutschland
Posts: 2
     imagecopyresampled Zitat | Bearbeiten

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 funktioniert das auch.
Hier der Weg dazu.
 PHP 
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:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
<?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 eben dieses erstellte Bild ein Overlay legen. Deshalb der oben gezeigte 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 downloaden: https://download.psygonis.de/test.rar


23.08.2023, 16:18 Profil | PM | Homepage | E-Mail  
Seiten (1):  1 
PHP-Support.de » Programmierung » PHP & MySQL » imagecopyresampled   

Neues Thema | Antworten   


Powered by Command Board 1.0 - Beta 2.0 © 2004-08 PHP-Einfach | Impressum | Datenschutz