Error generando Thumbnail - PHP
Buenas,
estoy tratando de generar unos thumbnails de los datos que se obtienen de una base de datos... mi conocimiento en php es limitado, pero segun los codigos que he pillado en tutoriales deberia funcionar, pero no es asi.
<code>function thumbjpeg($imagen) {
header("Content-type: image/jpeg");
$file = $imagen;
$W = 100;
$H = 100;
$X = 0;
$Y = 0;
$destinationImg = imagecreate($W,$H);
$sourceImg = imagecreatefromjpeg($file);
//imagecopyresized (dst_im, src_im, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH);
imagecopyresized($destinationImg,$sourceImg,0,0,$X,$Y,$W,$H,$W,$H);
imagejpeg($destinationImg);
imagedestroy($destinationImg);
}
Y la llamada la hago asi:
thumbjpeg($cover);
</code>
Donde $cover es de donde se saca el nombre del archivo.jpg de MySQL.
Y esto es lo que obtengo en la web:
<code>ÿØÿàJFIFÿþ>CREATOR: gd-jpeg v1.0 (using IJG JPEG v62), default quality ÿÛC $.' ",#(7),01444'9=82<.342ÿÛC 2!!222222222222222222222222ÿÀdd"ÿÄ ÿĵ}!1AQa"q2?¡#B±ÁRÑð$3br? %&'()*456789:CDEFGHIJSTUVWXYZcdefghijstuvwxyz?????????????????¢£¤¥¦§¨©ª²³´µ¶·¸¹ºw... e</code>
Alguien sabe cual puede ser el problema?
meddle
a mi me funciona, de hecho creo que ese codigo lo puse yo por aqui. :)
ni idea. ¿tienes la GD instalada?
Hipster
deberia tenerlas instaladas... he hecho pruebas creando imagenes dinamicas y sin problemas... solo me da problemas cuando intento crear un thumbnail desde un jpg dado en una base de datos :S
por si sirve de ayuda estoy trasteando con phpnuke, mis primeros pinitos con php :)
meddle
¿en la bbdd esta el jpg o el nombre del archivo?
xoan
en la funcion lo unico que debes hacer es crear la thumbnail, y no intentar mandarla al navegador, es decir, que en la funcion sobra el header; y a la hora de crearla, lo que debes hacer es indicar un segundo parametro que sera el nombre con el que la guardas en tu servidor.
luego se llama como si fuese una imagen normal:
<code><img src="nombre.jpg" /></code>
Ahora bien, si lo que quieres es crearlas al vuelo, no uses la funcion, sino que mete ese codigo talcual en un archivo sin nada mas y lo llamarias de este modo:
<code><img src="archivo.php?imagen=dato_de_la_db" /></code>
creo que asi funcionara...
Hipster
a ver si me explico un poco mejor :)
yo en la pagina tengo este codigo, todo un mismo archivo, que llama al nombre del archivo que esta en una bbdd.
<code>/* Last Reviews */
function thumbjpeg($imagen) {
header("Content-type: image/jpeg");
$file = $imagen;
$W = 100;
$H = 100;
$X = 0;
$Y = 0;
$destinationImg = imagecreate($W,$H);
$sourceImg = imagecreatefromjpeg($file);
//imagecopyresized (dst_im, src_im, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH);
imagecopyresized($destinationImg,$sourceImg,0,0,$X,$Y,$W,$H,$W,$H);
imagejpeg($destinationImg);
imagedestroy($destinationImg);
}
$sql = "SELECT * FROM ".$prefix."_reviews ORDER BY date DESC LIMIT 0,5";
$result = $db->sql_query($sql);
echo "<table border=\"0\" bgcolor=\"$bgcolor1\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\"><tr><td colspan=\"2\" bgcolor=\"$bgcolor3\" align=\"left\" height=\"12\">\n"
."<font class=\"option2\"><center><b>Críticas Discográficas</b></center></font></td></tr><tr><td><tr>\n";
while ($row = $db->sql_fetchrow($result)) {
$cover = $row[cover];
$email = $row[email];
$id = $row[id];
$date = $row[date];
$title = $row[title];
$reviewer = $row[reviewer];
$text = $row[text];
$hits = $row[hits];
$review = substr ("$text", 0, 100);
if ($cover != "") {
echo "<td valign=\"top\" width=\"250\"><a href=\"modules.php?name=Reviews&rop=showcontent&id=$id\" class=\"titlereview\"><b>$title</b></a><a href=\"modules.php?name=Reviews&rop=showcontent&id=$id\">";
header("Content-type: image/jpeg");
thumbjpeg ($cover);
echo "</a>\n";
}
else {
echo "<td valign=\"top\">";
}
if($hits>0) {
echo "<br><a href=\"modules.php?name=Reviews&rop=showcontent&id=$id\" class=\"contenido2\">$review ... </a></td></tr><tr><td align=\"right\" bgcolor=\"$bgcolor2\"><a href=\"mailto:$email\" class=\"sender\">$reviewer</a> | $date&nbsp;&nbsp;</td></tr>\n";
$lugar++;
}
}
echo "</td></tr><tr><td bgcolor=\"$bgcolor3\" align=\"right\" height=\"15\"><font class=\"option2\"><b><a href=\"modules.php?name=Reviews\" class=\"morelink\">Todas las Críticas </a></b></font></td></tr></table><br>\n";
echo "</td></tr><tr><td valign=\"top\">";</code>
la pagina , por si quereis verla, esta funcionando en www.rockabillyrules.com , y esta parte del codigo corresponde a la tabla "CRITICAS DISCOGRAFICAS" donde aparecen las portadas de las ultimas criticas. Ahora las estoy reduciendo a lo bruto, por eso quiero crear thumbnails "al vuelo" para que no se distorsione la imagen.
No os fijeis mucho en el diseño de la web, que por lo pronto es algo muy precario que estoy cambiando poco a poco.
a ver si dais con el problema... plissssss :)
Surt
Has probado con poner en vez de este codigo:
imagecreate($W,$H);
este otro?
imagetruecolor($W,$H);
A mi me paso algo parecido con ciertos jpg y fue porque no podian crearme el thubnail con ciertos jpg a truecolor...
Esta es la direcc. en php.net: http://es.php.net/manual/en/function.imagecreatetruecolor.php
Hipster
bueno...
he pillado un codigo mas simple preguntando al oraculo google y he conseguido que me cree un thumbnail al vuelo, pero el problema ahora es que me crea un jpeg completamente negro...
sabeis cual puede ser el problema ahora?
<code><?php
$fuente = @imagecreatefromjpeg($ruta);
$imgAncho = imagesx ($fuente);
$imgAlto =imagesy($fuente);
$imagen = ImageCreate($ancho,$alto);
ImageCopyResampled($imagen,$fuente,0,0,0,0,$ancho,$alto,$imgAncho,$imgAlto);
Header("Content-type: image/jpeg");
imagejpeg($imagen);
?> </code>
y la llamada:
<code> echo "<img src=\"modules/updates/imagen.php?ruta=$cover&ancho=70&alto=70\" border=\"0\" align=\"left\">";
</code>
pues si podeis volver a ayudarme seria de gran ayuda...
Surt
jur.. yo lo se ... yo lo seeee...
:p
Es por lo mismo que te dije arriba, con imagecreate creas una imagen con paleta de colores. si tu imagen es truecolor puede quedar en negro.
La prueba la tienes en que a mi me pasa lo mismo porque no tengo la libreria GD 2.0 o superior, sino la 1.67.... http://www.patriciafernandez.net/fotos.php
usa el codigo que te di arriba, solo cambia imagecreate por imagetruecolor ...
Hipster
pos si pongo imageTrueColor me encuentro con la famosa X de error....
me estoy volviendo loco!!!!! :(
Surt
Bueno, lo que tienes que hacer es irte a la direccion de la pagina de las librerias GD, habiendote enterado antes de que version usa tu servidor (con un archivo info.php que contenga la linea
<?php phpinfo(); ?>
A mi me pasa que si guardo mi jpg como gif con paleta de colores y luego ese gif lo grabo como jpg sin compresion y lo cuelgo el imagecreate me lo hace bien, pero no me interesa claro porque no quiero los thubnails de esa calidad.
Hipster
ya esta solucionado...
usando, manipulando, mezclando y nosequemas... varios codigos que saque por ahi, incluso alguna informacion que me llego por email, gracias hartum ;)
al final he dado con esto, que no se si estara bien del todo o sobrara codigo... pero lo importante por ahora es que me funciona :)
<code>/* Last Reviews */
function thumbjpeg($imagen,$altura) {
$dir_thumb = "thumbs/";
$prefijo_thumb = "tn_";
$nombre= $imagen;
$camino= "images/reviews/";
if (!file_exists($camino.$dir_thumb))
mkdir ($camino.$dir_thumb, 0777) or die("No se ha podido crear el directorio $dir_thumb");
if (!file_exists($camino.$dir_thumb.$prefijo_thumb.$nombre)) {
echo $camino.$dir_thumb.$prefijo_thumb.$nombre." NO existía<br>n";
$img = imagecreatefromjpeg($camino.$nombre) or die("No se encuentra la imagen $camino$nombre<br>n");
$datos = getimagesize($camino.$nombre) or die("Problemas con $camino$nombre<br>n");
$ratio = ($datos[1] / $altura);
$anchura = round($datos[0] / $ratio);
$thumb = imagecreatetruecolor($anchura,$altura);
imagecopyresampled ($thumb, $img, 0, 0, 0, 0, $anchura, $altura, $datos[0], $datos[1]);
imagejpeg($thumb,$camino.$dir_thumb.$prefijo_thumb.$nombre);
}
}
$sql = "SELECT * FROM ".$prefix."_reviews ORDER BY date DESC LIMIT 0,5";
$result = $db->sql_query($sql);
echo "<table border=\"0\" bgcolor=\"$bgcolor1\" cellpadding=\"0\" cellspacing=\"2\" width=\"100%\"><tr><td colspan=\"2\" bgcolor=\"$bgcolor3\" align=\"left\" height=\"12\">\n"
."<font class=\"option2\"><center><b>Críticas Discográficas</b></center></font></td></tr><tr><td><tr>\n";
while ($row = $db->sql_fetchrow($result)) {
$cover = $row[cover];
$email = $row[email];
$id = $row[id];
$date = $row[date];
$title = $row[title];
$reviewer = $row[reviewer];
$text = $row[text];
$hits = $row[hits];
$review = substr ("$text", 0, 100);
if ($cover != "") {
echo "<td valign=\"top\" width=\"250\"><a href=\"modules.php?name=Reviews&rop=showcontent&id=$id\" class=\"titlereview\"><b>$title</b></a><a href=\"modules.php?name=Reviews&rop=showcontent&id=$id\">";
thumbjpeg($cover, 70);
echo "<img src=\"images/reviews/thumbs/tn_$cover\" align=\"left\" border=\"0\">";
echo "</a>\n";
}
else {
echo "<td valign=\"top\">";
}
if($hits>0) {
echo "<br><a href=\"modules.php?name=Reviews&rop=showcontent&id=$id\" class=\"contenido2\">$review ... </a></td></tr><tr><td align=\"right\" bgcolor=\"$bgcolor2\"><a href=\"mailto:$email\" class=\"sender\">$reviewer</a> | $date&nbsp;&nbsp;</td></tr>\n";
$lugar++;
}
}
echo "</td></tr><tr><td bgcolor=\"$bgcolor3\" align=\"right\" height=\"15\"><font class=\"option2\"><b><a href=\"modules.php?name=Reviews\" class=\"morelink\">Todas las Críticas </a></b></font></td></tr></table><br>\n";
echo "</td></tr><tr><td valign=\"top\">"</code>
Me quedo con la rabia de no saber bien lo que he hecho... solo a medias... :( siempre he odiado el copy and paste... pero uno es inutil para algunas cosas y no hay mas remedio