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.
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
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($baseImage, false);
imagesavealpha ($baseImage, true);
//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();
?>
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
Kommentar