Bilder automatisch verkleinern, wenn größer als ...


#1
Ich habe ein Script, welches mir ein Wasserzeichen auf Bilder macht. Nun ist es aber leider so, dass wenn Bilder recht groß sind, wird das Wasserzeichen ziemlich kein dargestellt.
Deswegen würde ich die Bilder gern auf eine maximale Größe verkleinern. Html kann ich zwar aber bei PHP hört leider mein Verständnis auf, deswegen wollte ich mal fragen ob mir jemand von euch helfen könnte, oder ob jemand eine andere Idee hat.
Hier mal meine php Datei dazu
PHP:
<?php

function watermarkImage($tmpName)
{
    $scaling = 0.20;
    $watermarkPadding = 30;
    $uploadedImage = file_get_contents($tmpName);

    $image = new Imagick();
    $image->readImageBlob($uploadedImage);
    $imageWidth = $image->getImageWidth();
    $imageHeight = $image->getImageHeight();


    $watermark = new Imagick();
    $watermark->readImage("img//watermark.png");
    $watermark->scaleImage($watermark->getImageWidth() * $scaling, $watermark->getImageHeight() * $scaling);
    $watermarkWidth = $watermark->getImageWidth();
    $watermarkHeight = $watermark->getImageHeight();


    $watermarkLocationX = $imageWidth - $watermarkPadding - $watermarkWidth;
    $watermarkLocationY = $imageHeight - $watermarkPadding - $watermarkHeight;
    $image->compositeImage($watermark, imagick::COMPOSITE_OVER, $watermarkLocationX, $watermarkLocationY);
    $image->setFilename(uuid());

    return base64_encode($image);
}

function uuid()
{
    return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x',

        mt_rand(0, 0xffff), mt_rand(0, 0xffff),
        mt_rand(0, 0xffff),
        mt_rand(0, 0x0fff) | 0x4000,
        mt_rand(0, 0x3fff) | 0x8000,
        mt_rand(0, 0xffff), mt_rand(0, 0xffff), mt_rand(0, 0xffff)
    );
}

$uploadedImage = false;
if (!empty($_FILES)) {
    $base64encodedImages = [];
    foreach ($_FILES['images']['tmp_name'] as $tmpName) {
        $base64encodedImages[] = watermarkImage($tmpName);
    }

}

?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width">
    <title>Wasserzeichen</title>
    <style>
input[type=file], input[type=submit] {
            background-color: #1B91DB;
            border: none;
            text-decoration: none;
            color: white;
            padding: 10px 10px;
            margin: 10px 10px;
            cursor: pointer;
}
</style>
</head>
<body>
<h3>Wasserzeichen</h3>
<p>Bitte lad eine Datei hoch um diese mit dem hinterlegten Wasserzeichen zu ergänzen.</p>

<form method="post" enctype="multipart/form-data">
    <input type="file" name="images[]" accept="image/*" required multiple="multiple"><br>
    <input type="submit">
</form>

<?php
if (!empty($base64encodedImages)) {
    foreach ($base64encodedImages as $fileName => $base64encodedImage) {
        ?>
        <a href="data:image/jpeg;base64,<?= $base64encodedImage ?>" download="<?= uuid() ?>.jpg">
            <img width="300" src="data:image/jpeg;base64,<?= $base64encodedImage ?>">
        </a>
        <?php
    }
}
?>
</body>
</html>
 

Sempervivum

Erfahrenes Mitglied
#2
Nun ist es aber leider so, dass wenn Bilder recht groß sind, wird das Wasserzeichen ziemlich klein dargestellt.
Deine Funktion bietet die Möglichkeit, das Wasserzeichen zu skalieren:
Code:
$scaling = 0.20;
// ...
$watermark->scaleImage($watermark->getImageWidth() * $scaling, $watermark->getImageHeight() * $scaling);
Wie Du siehst, wird momentan auf 1/5 der Originalgröße herunter skaliert. Es sollte kein Problem sein, die Skalierung entspr. der Größe des Hauptbildes anzupassen.
 

Neue Beiträge