Script php: Aggiungere un logo watermark ad una immagine

   difficoltà:  script script script script script

Download
Script simili
9/11/2006


Script inviato da: Silvio Rainoldi
Web site: www.ianaz.ch


Questa classe consente di aggiungere ad un'immagine un logo (watermark) in un punto a scelta dell'immagine. Lo script consente inoltre di creare una thumb dell'immagine stessa.
L'utilizzo base è molto semplice, basta includere il file img.class.php e indicare il percorso dell'immagine a cui aggiungere il logo e il percorso del logo stesso:

<?
require("img.class.php");
$img = new img;
$img->AddLogo("pippo.jpg", "logo.png");
?>
In questo modo verrà aggiunta all'immagine pippo.jpg il logo logo.png e creata la miniatura. Possono inoltre essere settate alcune proprietà aggiuntive che, se non specificate saranno quelle di default:
<?
require("img.class.php");
$img = new img;
//variabili settabili (valori segnati default)
$img->name = ""; //nome immagine senza estensione, di default preso nome originale
$img->thumb_w = 172; // larghezza thumb in px
$img->thumb_h = 130; // altezza thumb in px
$img->max_w = 720; // larghezza max in px
$img->max_h = 540; // altezza max in px
$img->pos_x = "RIGHT"; // posizione logo -> RIGHT, LEFT, CENTER
$img->pos_y = "BOTTOM"; // posizione logo -> BOTTOM, TOP, MIDDLE
$img->img_folder = ""; // cartella immagine grande (default-> cartella dell'immagine originale)
$img->thumb_folder = ""; // cartella immagine thumb (default-> cartella dell'immagine originale)
$img->saveBIG = 1; //salvare immagine grande 1 o 0
$img->saveTHUMB = 1; //salvare thumb -> 1 o 0
$img->AddLogo("pippo.jpg", "logo.png");

//se necessario effettuare altre operazioni sulle immagini
//$img->new_image (risorse immagine)
//$img->thumb (risorsa thumb)
?>
Ecco qui a questo punto il file img.class.php:
<?php
/*
iaTermark
Created by Silvio Rainoldi
www.ianaz.ch
*/
class img
{
var $thumb_w = 172; // larghezza thumb
var $thumb_h = 130; // altezza thumb
var $max_w = 720; // larghezza max
var $max_h = 540; // altezza max
var $pos_x = "RIGHT"; // posizione logo
var $pos_y = "BOTTOM"; // posizione logo
var $img_folder = ""; // cartella immagine grande
var $thumb_folder = ""; // cartella immagine thumb
var $saveBIG = 1; //salvare immagine grande
var $saveTHUMB = 1; //salvare thumb
var $name = ""; //nome immagine senza estensione

function AddLogo($image, $logo = NULL)
{
$this->im = $this->createImgage($image);
$this->im_width = imagesx($this->im);
$this->im_height = imagesy($this->im);
$this->wt_x = $this->calc_pos_x($this->pos_x);
$this->wt_y = $this->calc_pos_y($this->pos_y);
$this->new_image = $this->resizeImg();

$this->resizeForThumb();
if($logo != NULL)
{
$this->createTheLogo($logo);
}
if($this->name==""){
$this->name = substr($image, 0 , strrpos($image, "."));
}
if($this->saveBIG == 1)
{
imagejpeg($this->new_image, $this->img_folder.$this->name."_big.jpg");
}
if($this->saveTHUMB == 1)
{
imagejpeg($this->thumb, $this->thumb_folder.$this->name."_small.jpg");
}

}

function createImgage($image){
$type = strtolower(substr($image, strrpos($image, "."), strlen($image)-strrpos($image, ".")));
if($type==".jpeg" || $type==".jpg"){
return imagecreatefromjpeg($image);
}elseif($type==".gif"){
return imagecreatefromgif($image);
}elseif($type==".png"){
return imagecreatefrompng($image);
}else{
die("Immagine non valida");
}
}

function createTheLogo($logo)
{
$this->logo = $this->createImgage($logo);
$this->logo_width = imagesx($this->logo);
$this->logo_height = imagesy($this->logo);
$this->wt_x = $this->calc_pos_x($this->pos_x);
$this->wt_y = $this->calc_pos_y($this->pos_y);
imagecopymerge($this->new_image, $this->logo, $this->wt_x, $this->wt_y, 0, 0, $this->logo_width, $this->logo_height, 100);
}


function resizeImg()
{

if($this->im_width > $this->max_w && $this->im_height < $this->max_h)
{

$rapporto = $this->max_w / $this->im_width;

$this->new_im_w = $this->im_width * $rapporto;
$this->new_im_h = $this->im_height * $rapporto;

}

else if($this->im_width < $this->max_w && $this->im_height > $this->max_h)
{

$rapporto = $this->max_h / $this->im_height;

$this->new_im_w = $this->im_width * $rapporto;
$this->new_im_h = $this->im_height * $rapporto;

}
else if($this->im_width > $this->max_w && $this->im_height > $this->max_h)
{

$rapporto_1 = $this->max_w / $this->im_width;
$rapporto_2 = $this->max_h / $this->im_height;
if($rapporto_1 > $rapporto_2)
{
$rapporto = $rapporto_2;
}
else
{
$rapporto = $rapporto_1;
}

$this->new_im_w = $this->im_width * $rapporto;
$this->new_im_h = $this->im_height * $rapporto;

}

else
{
$this->new_im_w = $this->im_width;
$this->new_im_h = $this->im_height;
}

$this->new_image = imagecreatetruecolor($this->new_im_w, $this->new_im_h);
imagecopyresized($this->new_image, $this->im, 0, 0, 0, 0, $this->new_im_w, $this->new_im_h, $this->im_width, $this->im_height);

return $this->new_image;

}
function resizeForThumb()
{
$thumb_w = $this->thumb_w;
$thumb_h = $this->thumb_h;
if($this->im_width > $this->im_height)
{
$rapporto = $this->im_height / $this->im_width;
$thumb_h = $this->thumb_h * $rapporto;
$thumb_w = $this->thumb_w * $rapporto;
}
else if($this->im_width < $this->im_height)
{
$rapporto = $this->im_width / $this->im_height;
$thumb_w = $this->thumb_w * $rapporto;
}
else
{
$thumb_w = $this->thumb_w;
$thumb_h = $this->thumb_h;
}
$this->thumb = imagecreatetruecolor($thumb_w, $thumb_h);
imagecopyresized($this->thumb, $this->new_image, 0, 0, 0, 0, $thumb_w, $thumb_h, $this->new_im_w, $this->new_im_h);

}

function calc_pos_x($position_x)
{
$x = 0;
switch($position_x)
{
case 'LEFT':
$x = 0;
break;
case 'CENTER':
$x = @$this->new_im_w / 2 - @$this->logo_width / 2;
break;
case 'RIGHT':
$x = @$this->new_im_w - @$this->logo_width;
break;
default:
$x = 0;
}
return $x;

}

function calc_pos_y($position_y)
{
$y = 0;
switch($position_y)
{
case 'TOP':
$y = 0;
break;
case 'MIDDLE':
$y = @$this->new_im_h / 2 - @$this->logo_height / 2;
break;
case 'BOTTOM':
$y = @$this->new_im_h - @$this->logo_height;
break;
default:
$y = 0;
}
return $y;

}

}

?>





Commenti


  Andrea Micheloni

9/11/2006 22:37:16

Molto utile! Questo me lo segno...
P.S. l'immagine di convalida dà sempre errore, o quasi...

  Fabio

9/11/2006 23:55:14

Grazie per la segnalazione.
Faro' qualche test. Puo' essere magari che a volte non siano chiare le differenze tra maiuscole minuscole, tra zero e O?

  Silvio

10/11/2006 7:15:48

"Puo' essere magari che a volte non siano chiare le differenze tra maiuscole minuscole, tra zero e O?"
In che senso? :P

"l'immagine di convalida dà sempre errore, o quasi..."
che errore da e quando?

  Fabio

10/11/2006 9:10:02

Credo che Andrea parli dell'immagine di controllo per l'invio di commenti, non allo script. Tu Silvio hai avuto problemi nell'inserire commenti? Pensavo quasi di utilizzare solo le lettere alfabetiche minuscole per non dar edito a dubbi.

  Silvio

10/11/2006 10:57:29

Ah scusa, pensavo si riferisse alla classe.
Io non ho problemi per inserire commenti...


  Andrea Micheloni

13/11/2006 16:56:47

Beh, di solito gli script captcha (le immagini di convalida) Tolgono del tutto le "o" o gli zeri, oppure li considerano come uguali per non permettere che l'utente si confonda...

Il mio problema, in effetti, era che due commenti non erano stati postati per un (mio? mah) errore di riscrittura, ma ora mi pare sia tutto a posto...

  Fabio

13/11/2006 17:14:07

Si in effetti ho eliminato i numeri e le maiuscole per dar meno adito a problemi di interpretazione. Ho mantenuto solo le minuscole, ora dovrebbe essere per lo meno più chiaro.

  charlotte

6/1/2007 16:25:36

Ciao a tutti,
credo che questo script sia semplicemente perfetto...
non conoscendo però bene il PHP ho problemi nel "chiamarlo"...
mi spiego, mi basta modificare il sorgente e creare un file php,
o c'è altro da fare?
tnx @

  Fabio

7/1/2007 20:00:12

ciao,
allora crei il file img.class.php con il contenuto dell'ultimo box.
Poi in qualunque file php tu sia inserisci:

<?
require("img.class.php");
$img = new img;
// qui tutte le opzioni che ti servono
$img->AddLogo("pippo.jpg", "logo.png");
?>

  charlotte

8/1/2007 0:20:08

stanotte provo allora :) con easyphp in locale

  charlotte

11/1/2007 17:16:19

ciao, ho provato... ecco cos'ho fatto:
- img.class.php con l'ultimo box
- prova.php

pippo.JPG e logo.png

chiamo il file prova.php e mi dice

Fatal error: Call to undefined function: imagecreatefromjpeg() in \\easyphp1-8\www\img.class.php on line 52

cos'ho cannato :DDD?

tnx @


  Fabio

11/1/2007 17:36:05

è probabile che di default easyphp non abbia le estensioni GD attive per l'elaborazione delle immagini.
Prova ad attivarle cosi:
- tasto destro sulla 'e' Di easyphp
- configurazione
- estensioni php
- seleziona php_gd2
- premi applica
- riavvia easyphp

  charlotte

20/1/2007 4:56:40

ciao.. l'ho fatto ma esce "storpiato" :(

  Fabio

20/1/2007 11:16:58

storpiato?in ke senso? cosa? l'immagine non tiene le proporzioni?

  charlotte

23/1/2007 6:13:47

no guarda...ho tolto il nome del sito, calcola k la img mi esce con il logo così e nn in trasparenza... adesso ho provato a farlo in c# e crea l'immagine in modo corretto, xò non riesco a regolare il canale alpha.. c riuscirò...

http://img201.imageshack.us/img201/9463/wt2error6nx.png
esce così , sarà xkè la png è a 32bit e nn 24?


ciao e grazie

  Massi

25/1/2007 12:17:39

Ciao, ho provato lo script, ed è tutto molto semplice e veloce, tranne per il fatto che non mantiene la trasparenza, ossia mi aggiunge il logo (creato con uno sfondo trasparente) con uno sfondo bianco: come posso ovviare il problema!??!

  Fabio

25/1/2007 12:47:43

prova a sostituire nella funzione createTheLogo($logo) della classe:


imagecopymerge($this->new_image, $this->logo, $this->wt_x, $this->wt_y, 0, 0, $this->logo_width, $this->logo_height,100);

con

imagecopy($this->new_image, $this->logo, $this->wt_x, $this->wt_y, 0, 0, $this->logo_width, $this->logo_height);

dovrebbe mantenere la trasparenza.

  Massi

25/1/2007 15:46:04

Ho fatto la modifica che mi hai suggerito: perfetto!

Grazie tante per la disponibilità

  Francesco

30/4/2007 16:44:49

Scusa io ho provato ad usare la classe ma non capisco come fare x visualizzare l'img dopo aver usato la classe per applicare il watermark, potresti indicarmi come

  Fabio

1/5/2007 18:35:43

L'immagine con watermark viene salvata in una cartella. Did default è la cartella in cui c'è l'immagine originale. Altrimenti con:

$img->img_folder = "public/";

si setta la cartella in cui creare l'immagine.

  Marco

25/7/2007 12:08:17

Scusate: è possibile evitare di salvare l'immagine creata? Ovvero limitarsi a... generarla in RAM per la visualizzazione e basta?

Servirebbe qualche nota sul come produrre il watermark, io fino ad ora non sono ci sono riuscito con GIMP e per provare ho usato alcune PNG già pronte.

Grazie.

  letsjump

14/8/2007 14:38:57

ottimo script!
l'unica cosa che avrei voluto in più è ridurre proporzionalmente anche le dimensioni della thumb. A dire il vero, ho notato che se un'immagine ha H > di W la thumb viene proporzionata. Se invece H < W allora crea un quadrato perfetto delle dimensioni dichiarate.
E' vero o forse ho impostato male qualcosa?

  Esteban

4/10/2007 12:24:20

Se non vado errato per un bug nelle GD2 si DEVONO usare PNG-8, non 24

  giorda86

31/3/2011 7:21:25

ciao, volevo chiedere 3 cose:

1-sto cercando di applicare il watermark, ci riesco con un watermark ti tipo jpg ma con un watermark in formato png, nell'area dove dovrebbe apparire compare una banda nera della dimensione del file watermark... come mai? non supporta il watermark in png?

2- ma l'immagine che crea lo script, è per forza jpg? ho provato a far si che l'immagine creata sia nel formato originale di quella caricata, ma non ci sono riuscito...

3- come faccio a far si che l'immagine creata sia delle dimensioni dell'immagine originale?



Lascia un commento


Codice di controllo*:
Nome*:
Email/Link:
Testo*:
 
I campi contrassegnati con * sono obbligatori.