View Full Version : [PHP] Problema con "imagejpeg"
Ho un problema con la funzione imagejpeg (http://php.net/manual/en/function.imagejpeg.php).
Da quel che ho capito dovrebbe creare un immagine jpeg, il fatto è che a me crea un immagine .bmp, è possibile?
Questo è il codice:
captcha.php
imagejpeg($immagine, NULL, 90);
pagina.html
<img src="captcha.php" id="imm_verifica" border="1" width="180" height="50" />
ma lol!!
sei sicuro che non è semplicemente una jpg con estensione BMP?
ma lol!!
sei sicuro che non è semplicemente una jpg con estensione BMP?
Esatto... cosa più probabile!
A ma questa cosa viene fatta in automatico? Cioè non posso visualizzare un file .jpg?
puoi postare qui sul forum una di quelle immagini?
-----EDIT-----
ho appena provato quella funzione copia/incollando il codice di esempio sulla pagina ufficiale
<?php
// Create a blank image and add some text
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);
// Set the content type header - in this case image/jpeg
header('Content-type: image/jpeg');
// Output the image
imagejpeg($im);
// Free up memory
imagedestroy($im);
?>
mi genera un'immagine con estensione .php ma che comunque è una jpg
Ma infatti io faccio img scr del file pc, però quando salvo l'immagine con il tato destro mi salva questo file: "untitled.bmp"
Facendo l'img scr del file php che crea l'immagine jpg non dovrebbe visualizzarmi una jpg?
non so che dire...
ti sei ricordato
header('Content-type: image/jpeg');
nel file che genera l'immagine?
Si... non so più dove guardare... :muro:
Si... non so più dove guardare... :muro:
Ma è solo un problema di estensione?
Il file che genera è un jpeg con estensione bmp?
Come faccio a capire se è un jpg con estensione bmp o è un vero e proprio bmp?
Come faccio a capire se è un jpg con estensione bmp o è un vero e proprio bmp?
mmm da terminale ls -l :)
mmm da terminale ls -l :)
mi correggo, mi pare che in PHP esista una funzione per analizzare un tipo di dato :)
Per conoscere il formato del contenuto di un file puoi usare il comando "file" in questo modo: file nome_del_file
La funzione imagejpg con NULL come secondo parametro invia il bytecode della JPEG sullo standard output, quindi non è quella funzione che sta creando il file che dici ma qualcos'altro.
Se l'immagine è all'interno di un tag <img> e clicchi sulle proprietà dell'immagine, è possibile che il browser dica BMP anche se è JPEG perché ingannato dall'estensione PHP dell'immagine.
Per conoscere il formato del contenuto di un file puoi usare il comando "file" in questo modo: file nome_del_file
La funzione imagejpg con NULL come secondo parametro invia il bytecode della JPEG sullo standard output, quindi non è quella funzione che sta creando il file che dici ma qualcos'altro.
Se l'immagine è all'interno di un tag <img> e clicchi sulle proprietà dell'immagine, è possibile che il browser dica BMP anche se è JPEG perché ingannato dall'estensione PHP dell'immagine.
Ecco, ottima risposta!
Ecco, ottima risposta!
:mano:
Ok, ma è normale che una jpg qualità 90 come questa occupi 26Kb?
http://img29.imageshack.us/img29/9606/52113700.png
beh, ma in fin dei conti chissene della qualità, secondo me 40 andrebbe più che bene per l'uso che si fa dell'immagine generata, non si ha bisogno di una qualità eccelsa in questi casi
Comunque provandola ad aprire con programmi di fotoritocco ho notato che quella è a tutti gli effetti una Bitmap, infatti se così non fosse i 26Kb non si spiegherebbero.
Ho provato a convertire la stessa immagine a qualità 100, quindi massima ed occupa meno di 4Kb, a pari qualità occupa 2,4Kb. Quindi un decimo.
Non capisco com'è possibile che nel file php creo un immagine jpeg qualità 90, nel file html faccio l'img scr di quel file e mi viene visualizzato come un bmp che occupa 10 volte tanto.
Anche mettendo qualita 40 o meno, il file oltre a vedersi male occupa tanto perchè viene comunque convertito in bmp.
questo è il codice completo del file php di cui faccio l'img scr:
<?php
header("Content-type: image/jpeg");
function sfondi()
{
$dir = opendir("sfondi/");
$counter =0;
while (($file = readdir($dir)) == true ) {
if ($counter == 1) { $counter = ''; } else {
if ($file !== '.' AND $file !== '..') {
$sfondi[] = "sfondi/$file";
$counter = $counter+1;
}
}
}
$elemarray=$counter-1;
$sfondo = $sfondi[mt_rand(0,$elemarray)];
return $sfondo;
}
$immagine = imagecreatefromjpeg(sfondi());
$nero = imagecolorallocate($immagine, 0, 0, 0);
$colore = array("$nero");
function cerca_carattere()
{
$carattere = mt_rand(49,122);
$charesclusi = array(58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,108,111);
if (in_array($carattere,$charesclusi))
{
return cerca_carattere();
}
else
{
return $carattere;
}
}
function fonts()
{
$dir = opendir("fonts/");
$counter = 0;
while (($file = readdir($dir)) == true )
{
if ($file !== '.' AND $file !== '..')
{
$font[] = "fonts/$file";
$counter = $counter+1;
}
}
$elemarray=$counter-1;
$fonts = $font[mt_rand(0,$elemarray)];
return $fonts;
}
$x = 11;
$y= 20;
for ($c=0; $c<=3; $c++)
{
$char = chr(cerca_carattere());
imagettftext($immagine, mt_rand(25,35), mt_rand(28,-28), rand($x,$y), 40, $colore[0], fonts(), $char);
$x=($y+27);
$y=($x+13);
$caratteri[] = $char;
}
imagejpeg($immagine, NULL, 90);
imagedestroy($immagine);
session_start();
$codice = $caratteri[0].$caratteri[1].$caratteri[2].$caratteri[3];
$_SESSION['codice'] = $codice;
?>
Scusate... ma ora che ci penso... la funzione corretta non sarebbe:
imagecreatefromjpeg();
che genera un JPEG in base ad un parametro passato? ;)
Un esempio:
function LoadJpeg($imgname)
{
/* Attempt to open */
$im = @imagecreatefromjpeg($imgname);
/* See if it failed */
if(!$im)
{
/* Create a black image */
$im = imagecreatetruecolor(150, 30);
$bgc = imagecolorallocate($im, 255, 255, 255);
$tc = imagecolorallocate($im, 0, 0, 0);
imagefilledrectangle($im, 0, 0, 150, 30, $bgc);
/* Output an error message */
imagestring($im, 1, 5, 5, 'Error loading ' . $imgname, $tc);
}
return $im;
}
header('Content-Type: image/jpeg');
$img = LoadJpeg('bogus.image');
imagejpeg($img);
Esatto, infatti io faccio in quel modo... solo che poi facendo l'img scr del file.php per qualche losco motivo :muro: mi crea una bitmap.
<?php
header("Content-type: image/jpeg");
function sfondi()
{
$dir = opendir("sfondi/");
$counter =0;
while (($file = readdir($dir)) == true ) {
if ($counter == 1) { $counter = ''; } else {
if ($file !== '.' AND $file !== '..') {
$sfondi[] = "sfondi/$file";
$counter = $counter+1;
}
}
}
$elemarray=$counter-1;
$sfondo = $sfondi[mt_rand(0,$elemarray)];
return $sfondo;
}
$immagine = imagecreatefromjpeg(sfondi());
$nero = imagecolorallocate($immagine, 0, 0, 0);
$colore = array("$nero");
function cerca_carattere()
{
$carattere = mt_rand(49,122);
$charesclusi = array(58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,108,111);
if (in_array($carattere,$charesclusi))
{
return cerca_carattere();
}
else
{
return $carattere;
}
}
function fonts()
{
$dir = opendir("fonts/");
$counter = 0;
while (($file = readdir($dir)) == true )
{
if ($file !== '.' AND $file !== '..')
{
$font[] = "fonts/$file";
$counter = $counter+1;
}
}
$elemarray=$counter-1;
$fonts = $font[mt_rand(0,$elemarray)];
return $fonts;
}
$x = 11;
$y= 20;
for ($c=0; $c<=3; $c++)
{
$char = chr(cerca_carattere());
imagettftext($immagine, mt_rand(25,35), mt_rand(28,-28), rand($x,$y), 40, $colore[0], fonts(), $char);
$x=($y+27);
$y=($x+13);
$caratteri[] = $char;
}
imagejpeg($immagine, NULL, 90);
imagedestroy($immagine);
session_start();
$codice = $caratteri[0].$caratteri[1].$caratteri[2].$caratteri[3];
$_SESSION['codice'] = $codice;
?>
usi IE6 per salvare l'immagine?
Hai provato a dare i tre comandi di sessione all'inizio dello script prima del comando header?
Visto che da come lo descrivi sembra un bug, direi di provare ogni soluzione, anche la meno probabile...
Poi ti consiglio di abilitare la visualizzazione degli errori su browser e di richiamare l'indirizzo di questo script direttamente, per vedere se fornisce un'immagine o restituisce errori; considera che un errore corrompe l'output quando imposti il Content-type.
Prova a mandare in stampa $sfondo, dimmi cosa ritorna :)
Poi ti consiglio di abilitare la visualizzazione degli errori su browser e di richiamare l'indirizzo di questo script direttamente, per vedere se fornisce un'immagine o restituisce errori; considera che un errore corrompe l'output quando imposti il Content-type.[/QUOTE]
Richiamando direttamente il file captcha.php, mi visualizza sempre lo stesso file untitled.bmp, quindi direi che ora il problema è isolato a quel file.
[QUOTE=flx2000;29640485]Hai provato a dare i tre comandi di sessione all'inizio dello script prima del comando header?
Visto che da come lo descrivi sembra un bug, direi di provare ogni soluzione, anche la meno probabile...
Di quali 3 comandi parli?
Prova a mandare in stampa $sfondo, dimmi cosa ritorna :)
Dici in questo modo?
imagejpeg($sfondo, NULL, 90);
Se si da questi errori:
<br />
<b>Notice</b>: Undefined variable: sfondo in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>71</b><br />
<br />
<b>Warning</b>: imagejpeg() expects parameter 1 to be resource, null given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line
Dici in questo modo?
imagejpeg($sfondo, NULL, 90);
Se si da questi errori:
<br />
<b>Notice</b>: Undefined variable: sfondo in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>71</b><br />
<br />
<b>Warning</b>: imagejpeg() expects parameter 1 to be resource, null given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line
No dico al posto del return, fai un echo $sfondo; e un var_dump($sfondo);
vediamo cosa riporta. Se null inizio a preoccuparmi
Questo è il codice:
function sfondi()
{
$dir = opendir("sfondi/");
$counter =0;
while (($file = readdir($dir)) == true ) {
if ($counter == 1) { $counter = ''; } else {
if ($file !== '.' AND $file !== '..') {
$sfondi[] = "sfondi/$file";
$counter = $counter+1;
}
}
}
$elemarray=$counter-1;
$sfondo = $sfondi[mt_rand(0,$elemarray)];
echo $sfondo;
var_dump($sfondo);
}
Aprendo la pagina html non mi visualizza l'immagine, invece se avvio direttamente il file .php mi visualizza questi errori.
sfondi/sfondo.jpgstring(17) "sfondi/sfondo.jpg"
<br />
<b>Warning</b>: imagecreatefromjpeg() [<a href='function.imagecreatefromjpeg'>function.imagecreatefromjpeg</a>]: Filename cannot be empty in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>25</b><br />
<br />
<b>Warning</b>: imagecolorallocate() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>27</b><br />
<br />
<b>Warning</b>: imagettftext() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>68</b><br />
<br />
<b>Warning</b>: imagettftext() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>68</b><br />
<br />
<b>Warning</b>: imagettftext() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>68</b><br />
<br />
<b>Warning</b>: imagettftext() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>68</b><br />
<br />
<b>Warning</b>: imagejpeg() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>73</b><br />
<br />
<b>Warning</b>: imagedestroy() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>74</b><br />
Questo è il codice:
function sfondi()
{
$dir = opendir("sfondi/");
$counter =0;
while (($file = readdir($dir)) == true ) {
if ($counter == 1) { $counter = ''; } else {
if ($file !== '.' AND $file !== '..') {
$sfondi[] = "sfondi/$file";
$counter = $counter+1;
}
}
}
$elemarray=$counter-1;
$sfondo = $sfondi[mt_rand(0,$elemarray)];
echo $sfondo;
var_dump($sfondo);
}
Aprendo la pagina html non mi visualizza l'immagine, invece se avvio direttamente il file .php mi visualizza questi errori.
sfondi/sfondo.jpgstring(17) "sfondi/sfondo.jpg"
<br />
<b>Warning</b>: imagecreatefromjpeg() [<a href='function.imagecreatefromjpeg'>function.imagecreatefromjpeg</a>]: Filename cannot be empty in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>25</b><br />
<br />
<b>Warning</b>: imagecolorallocate() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>27</b><br />
<br />
<b>Warning</b>: imagettftext() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>68</b><br />
<br />
<b>Warning</b>: imagettftext() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>68</b><br />
<br />
<b>Warning</b>: imagettftext() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>68</b><br />
<br />
<b>Warning</b>: imagettftext() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>68</b><br />
<br />
<b>Warning</b>: imagejpeg() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>73</b><br />
<br />
<b>Warning</b>: imagedestroy() expects parameter 1 to be resource, boolean given in <b>C:\Program Files (x86)\EasyPHP5.3.0\www\ProvaFrom\captcha.php</b> on line <b>74</b><br />
Ok la variabile stringa contiene 'sfondi/sfondo.jpg' quindi è corretto, genera un jpeg. Ora ... perché esce un bmp? Questo che va capito. Sto pensando: impostazioni del server? Mi pare strano.
Attendo qualche idea da altri utenti!
Per l'idea delle impostazioni del server non saprei, per i test sto usando easyphp con le impostazioni di default. Però mi sembra strana una cosa del genere.
Prova a fargli creare un file nel modo più elementare possibile e verifica il formato che fornisce.
Esempio:
<?PHP
$img = imagecreatetruecolor(100,100);
imagefill($img,1,1,imagecolorallocate($img,0,255,0));
imagejpeg($img,"prova.jpg",90);
imagedestroy($img);
?>
Se prova.jpg non è un file JPEG (puoi capirlo col comando file prova.jpg) allora il problema è proprio di PHP.
L'output tipo del comando file dovrebbe essere tipo "prova.jpg: JPEG image data, JFIF standard 1.02" o qualcosa del genere.
Ho fatto una prova con questo file:
<?php
header("Content-type: image/jpeg");
$img = imagecreatetruecolor(100,100);
imagefill($img,1,1,imagecolorallocate($img,0,255,0));
imagejpeg($img,NULL,90);
imagedestroy($img);
?>
come risultato ottengo una jpg
Ho fatto una prova con questo file:
<?php
header("Content-type: image/jpeg");
$img = imagecreatetruecolor(100,100);
imagefill($img,1,1,imagecolorallocate($img,0,255,0));
imagejpeg($img,NULL,90);
imagedestroy($img);
?>
come risultato ottengo una jpg
LOL come non detto, siamo davanti ad un mistero :D
Torno al work che qui in redazione ce ne è bisogno! :D :D
Ok, grazie per l'aiuto...
Intanto aspetto il parere di qualcun'altro.
Prova un pò questa
<?php
header("Content-type: image/jpeg");
function sfondi(){
$dir="sfondi/";
$bgArray=array();
foreach(scandir($dir) as $bg){
if(!is_dir($bg)) $bgArray[]=$dir.$bg;
}
$randIndex=rand(0,count($bgArray)-1);
$randBg=$bgArray[$randIndex];
return $randBg;
}
$immagine=imagecreatefromjpeg(sfondi());
imagejpeg($immagine,NULL,90);
imagedestroy($immagine);
?>
A me crea una jpeg, scelta a random dalla dir.
Ulteriore verifica, come fai a capire che l'immagine è BMP?
Dove lo vedi?
Prova a mettere un nome al posto di NULL, ad esempio "prova.jpg", e vedi se quel file è JPEG.
[QUOTE=flx2000;29647165]Ulteriore verifica, come fai a capire che l'immagine è BMP?
Dove lo vedi?
QUOTE]
Se faccio le proprietà sull'immagine direttamente dal browser dice BMP.
Come ulteriore verifica l'ho aperto con programmi di fotoritocco.
Prova un pò questa
<?php
header("Content-type: image/jpeg");
function sfondi(){
$dir="sfondi/";
$bgArray=array();
foreach(scandir($dir) as $bg){
if(!is_dir($bg)) $bgArray[]=$dir.$bg;
}
$randIndex=rand(0,count($bgArray)-1);
$randBg=$bgArray[$randIndex];
return $randBg;
}
$immagine=imagecreatefromjpeg(sfondi());
imagejpeg($immagine,NULL,90);
imagedestroy($immagine);
?>
A me crea una jpeg, scelta a random dalla dir.
Se apro quel file mi esce una finestra con scritto:
Apache HTTP Server ha semsso di funzionare
Allora potrebbe essere davvero un problema di configurazione del tuo server.
Il mio script io l'ho provato direttamente sul mio spazio web.
Allora potrebbe essere davvero un problema di configurazione del tuo server.
Il mio script io l'ho provato direttamente sul mio spazio web.
E' ciò che sostenevo qualche topic sopra, è assurdo che generi un jpeg con estensione bmp è contro la logica di funzione di quella funzione (permettetemi il gioco di parole).
Provalo su uno spazio gratuito tipo netsons :)
Domanda di rito, ma tutti gli sfondi in quella sottodir sono PER CERTO delle JPEG?
Non sarebbe meglio usare qualcosa di più generico tipo imagecreatefromstring(file_get_contents(sfondi())); al posto di imagecreatefromjpeg(sfondi()); ?
Per sicurezza questo (http://allejp.netsons.org/varie/image.php) è il test che ho fatto io, gli sfondi devono essere NECESSARIAMENTE .jpeg(ma comunque ti avrebbe dato un errore ben preciso).
Comuqnue gli sfondi sono tutti jpg, anzi a dir la verita è solo uno, il ciclo c'è ancora perchè nel esempio che ho usato c'erano più sfondi e mi sono dimenticato di toglierlo.
Faccio salire il topic così magari c'è qualcun'altro che mi aiuta... :rolleyes:
Hai provato a fare come ti è stato consigliato?
Cioè provare esattamente il codice che ti è stato detto funzionare, e magari provarlo non sul server configurato da te?
Si l'ho provato, però come ti ho detto quando lo apro mi blocca apache.
Non saprei un'altra parte dove provarlo.
Fatti un account per uno spazio web free dq qualche parte e provalo lì.
Apache ti da un errore preciso o si pianta e basta?
Scusa, che versione di php usi?
Fatti un account per uno spazio web free dq qualche parte e provalo lì.
Apache ti da un errore preciso o si pianta e basta?
Scusa, che versione di php usi?
Netsons ad esempio; chiedo perdono se non si puo sponsorizzare, ma chi non conosce?
Fatti un account per uno spazio web free dq qualche parte e provalo lì.
Apache ti da un errore preciso o si pianta e basta?
Scusa, che versione di php usi?
L'ultima, dovrebbe essere easyphp 2.0
Il fatto è che non devo capire se è il mio easyphp che ha problemi perchè anche guardando sul sito della guida l'immagine del captcha in ouput è una bitmap.
Devo solo riuscire a capire qual'è il passaggio che la fa diventare bitmap invece di jpg.
Se il sito è questo (http://www.easyphp.org/) la 2.0 non mi sembra proprio l'ultima...
Versioni (http://sourceforge.net/projects/quickeasyphp/files/) :stordita:
ps. il bug è di easyphp sicuramente.
Per il file che mi hai passato tu ok, però per il mio file che viene creato come bmp non credo, dato che c'è l'esempio pubblicato online e anche li è bitmap.
Comunque avevo sbagliato a leggere è la 5.3.0
Dov'è l'esempio al quale ti riferisci?
se puoi posta un phpinfo.
Devi creare una pagina php così ed eseguirla da browser
<?php
phpinfo();
?>
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.