posso rifilare il bianco in eccedenza ad una immagine con le GD LIBRARY?
posso rifilare il bianco in eccedenza ad una immagine con le GD LIBRARY?
se sai già le dimensioni del bianco si... altrimenti nn so se esiste qualche funzione che individua il bianco e taglia..
no ogni immagine è diversa e non ne conosco la dimensione del bianco, sono generate con exec('ps2png);
Non so se c'è qualcosa di già pronto, se comunque il bordo bianco è "spesso" uguale su tutti e 4 i lati non è neanche troppo difficile creare una funzione ad hoc, un pò più complicato se ogni lato ha un eccedenza di bianco diversa.
Giusto per indirizzarti su come affronterei io il problema (cerca prima se c'è già qualche libreria pronta)
Intanto devi sapere le dimensioni dell'immagine
Tramite le librerie GD puoi ,con poche righe di codice, sapere il codice esadecimale di un determinato pixelCodice PHP:
$arr = getimagesize('immagine');
Ora tramite dei cicli non dovrebbe essere difficile trovare qual'è la prima "riga", partendo dall'alto, che non contiene solo biancoCodice PHP:
$x = 0; // Pixel sull'asse X
$y = 0; // Pixel sull'asse Y
$image = imagecreatefromgif("test.gif");
$arr = imagecolorat($image, $x ,$y);
extract(imagecolorsforindex($image, $arr));
$color = sprintf('#%02X%02X%02X', $red, $green, $blue);
// echo $color; restituirà #FFFFFF se c'è un bordo bianco
Esempio di utilizzo
questo va bene se come detto i lati bianchi hanno lo stesso spessore.Codice PHP:
<?php
function getHEX($image, $x, $y)
{
$arr = imagecolorat($image, $x ,$y);
extract(imagecolorsforindex($image, $arr));
return sprintf('#%02X%02X%02X', $red, $green, $blue);
}
$image = imagecreatefromgif("test.gif");
$arr = getimagesize("test.gif");
$width = $arr[0];
$height = $arr[1];
for($y = 0; $y < $height; $y++)
{
for($x = 0; $x < $width; $x++)
{
if(getHEX($image, $x, $y) != "#FFFFFF")
die("Altezza bordo bianco: {$y} pixel");
}
}
?>
dopo che sai quanto è il bordo bianco devi usare imagecopyresized() per tagliare l'immagine.
Questo giusto per indirizzarti, poi vedi un pò te![]()
penso che sia un buon suggerimento applicabile ai 4 lati dell'immagine, modificando il ciclo a cui fai riferimento dall'alto verso il basso, poi dal basso verso l'alto, da sx verso dx e da dx verso sx.
ci provo poi ti dirò
grazie dell'illuminazione![]()
Figurati, hai già valutato anche soluzioni JS+PHP? (certo serve l'azione lato client)
http://www.ajaxprogrammer.com/?p=9
http://mondaybynoon.com/examples/image_crop_resize/
Comunque non serve fare tutti questi cicli, a te basta sapere le cordinate dell'angolo in alto a sx e di quello in basso a dx per tagliare l'immagine.Originariamente inviato da modografico
penso che sia un buon suggerimento applicabile ai 4 lati dell'immagine, modificando il ciclo a cui fai riferimento dall'alto verso il basso, poi dal basso verso l'alto, da sx verso dx e da dx verso sx.
ci provo poi ti dirò
grazie dell'illuminazione![]()
Quindi ti serve un altro ciclo soltanto![]()
grazie alla tua illuminazione ci sono riuscito, però ho messo i cicli per tutti i 4 lati in previsione di immagini non squadrate, è un po lentino ma funziona
GrazieCodice PHP:
<?php
function getHEX($image, $x, $y)
{
$arr = imagecolorat($image, $x ,$y);
extract(imagecolorsforindex($image, $arr));
return sprintf('#%02X%02X%02X', $red, $green, $blue);
}
$image = imagecreatefrompng("ada.png");
$arr = getimagesize("ada.png");
$width = $arr[0];
$height = $arr[1];
//top
for($y = 0; $y < $height; $y++)
{
for($x = 0; $x < $width; $x++)
{
if(getHEX($image, $x, $y) != "#FFFFFF"){
$top=$y;
$x=$width;$y=$height;
}
}
}
//Bottom
for($y = $height-1; $y > 0; $y--)
{
for($x = 0; $x < $width; $x++)
{
if(getHEX($image, $x, $y) != "#FFFFFF"){
$bottom=$y+1;
$x=$width;$y=0;
}
}
}
//Left
for($x = 0; $x < $width; $x++)
{
for($y = $top; $y < $bottom; $y++)
{
if(getHEX($image, $x, $y) != "#FFFFFF"){
$left=$x;
$x=$width;$y=$height;
}
}
}
//Right
for($x = $width-1; $x > $left; $x--)
{
for($y = $top; $y < $bottom; $y++)
{
if(getHEX($image, $x, $y) != "#FFFFFF"){
$right=$x+1;
$x=0;$y=$height;
}
}
}
$newwidth = $right-$left;
$newheight = $bottom-$top;
// Content type
header('Content-type: image/jpeg');
// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
// Resize
imagecopyresized ($thumb, $image, 0, 0, $left , $top , $newwidth, $newheight, $newwidth, $newheight);
// Output
imagepng($thumb);
?>
così è più veloce
:quote:Codice PHP:
<?php
$image = imagecreatefrompng("ada.png");
$arr = getimagesize("ada.png");
$width = $arr[0];
$height = $arr[1];
//top
for($y = 0; $y < $height; $y++)
{
for($x = 0; $x < $width; $x++)
{
if(imagecolorat($image, $x ,$y) != 16777215 ){
$top=$y;
$x=$width;$y=$height;
}
}
}
//Bottom
for($y = $height-1; $y > 0; $y--)
{
for($x = 0; $x < $width; $x++)
{
if(imagecolorat($image, $x ,$y) != 16777215 ){
$bottom=$y+1;
$x=$width;$y=0;
}
}
}
//Left
for($x = 0; $x < $width; $x++)
{
for($y = $top; $y < $bottom; $y++)
{
if(imagecolorat($image, $x ,$y) != 16777215 ){
$left=$x;
$x=$width;$y=$height;
}
}
}
//Right
for($x = $width-1; $x > $left; $x--)
{
for($y = $top; $y < $bottom; $y++)
{
if(imagecolorat($image, $x ,$y) != 16777215 ){
$right=$x+1;
$x=0;$y=$height;
}
}
}
$newwidth = $right-$left;
$newheight = $bottom-$top;
// Content type
header('Content-type: image/jpeg');
// Load
$thumb = imagecreatetruecolor($newwidth, $newheight);
// Resize
imagecopyresized ($thumb, $image, 0, 0, $left , $top , $newwidth, $newheight, $newwidth, $newheight);
// Output
imagepng($thumb);
?>