DOMANDA Ridimensionare immagine in php

alemian95

Utente Attivo
1,173
370
CPU
13600K
Dissipatore
Thermalright Peerless Assassin 120 SE
Scheda Madre
MSI PRO Z790-P WIFI ATX
HDD
WD Black 1TB SN850X
RAM
Kingston Fury Renegade DDR5 Silver 32GB 6400MT/s CL32
GPU
Gigabyte RTX 4070 Ti GAMING OC 12G
Monitor
BenQ MOBIUZ EX3415R
PSU
Thermaltake Toughpower GF3 750W
Case
NZXT H5 Flow
Periferiche
Mouse: Logitech G403 - Tastiera: Durgod Taurus K320
Net
FTTC 100 mega
OS
Windows 11 Home 64 bit
Buongiorno a tutti, nel sito che sto costruendo ho la necessità di ridimensionare delle immagini in maniera tale da favorire il caricamento da parte degli utenti, non rendendo necessario il caricamento dell'immagine originale ma di una scalata.

Questo è il codice:
PHP:
<?
list($width, $height, $type, $attr) = getimagesize($img_path);
$thumb = imagecreatetruecolor(50, 50 * $height / $width);
if($type == 2) $source = imagecreatefromjpeg($img_path);
if($type == 3) $source = imagecreatefrompng($img_path);
imagecopyresized($thumb, $source, 0, 0, 0, 0, 50, 50 * $height / $width, $width, $height);
?>
<img src="<?= $thumb; ?>" alt=""/>

Ma visualizzando la pagina in questione l'immagine non appare, come posso procedere per risolvere? Grazie a tutti.
 

recursio

Nuovo Utente
20
2
Ciao,
con il codice che hai indicato stai inserendo nella proprietà "src" del tag "img" il valore della variabile risorsa ($thumb) dell'immagine..
Devi prima salvare il file da qualche parte, per esempio in una cartella cache, con il comando
imagejpeg($thumb, $path);
quindi dare in output qualcosa del tipo:
<img src="<?= $path; ?>" alt=""/>

In alternativa puoi specificare come "src" un file php che esegua la funzione di resize e in più mandi in output un'immagine al posto di un html.
Per esempio un file /immagine.php
PHP:
<?
$img_path=$_REQUEST['img'];

//CODICE ORIGINALE BEGIN
list($width, $height, $type, $attr) = getimagesize($img_path);
$thumb = imagecreatetruecolor(50, 50 * $height / $width);
if($type == 2) $source = imagecreatefromjpeg($img_path);
if($type == 3) $source = imagecreatefrompng($img_path);
imagecopyresized($thumb, $source, 0, 0, 0, 0, 50, 50 * $height / $width, $width, $height);
//CODICE ORIGINALE END

//Da implementare anche per jpg in modo analogo
header("Content-Type: image/png");
imagepng($thumb);
imagedestroy($thumb);

?>

e il tuo tag html diventerebbe solamente:
<img src="/immagine.php?img=foto.png">

non ho testato il codice, ma spero di essermi spiegato lo stesso abbastanza bene, oppure di averti dato qualche spunto giusto!
:)

Ciao!
 

alemian95

Utente Attivo
1,173
370
CPU
13600K
Dissipatore
Thermalright Peerless Assassin 120 SE
Scheda Madre
MSI PRO Z790-P WIFI ATX
HDD
WD Black 1TB SN850X
RAM
Kingston Fury Renegade DDR5 Silver 32GB 6400MT/s CL32
GPU
Gigabyte RTX 4070 Ti GAMING OC 12G
Monitor
BenQ MOBIUZ EX3415R
PSU
Thermaltake Toughpower GF3 750W
Case
NZXT H5 Flow
Periferiche
Mouse: Logitech G403 - Tastiera: Durgod Taurus K320
Net
FTTC 100 mega
OS
Windows 11 Home 64 bit
Diciamo che il concetto che volevo esprimere è proprio quello, fare in modo di mandare in output un immagine ridimensionata senza necessariamente doverla salvare sul server (dato che ho poco spazio), ho già testato codici e librerie già implementate per questa funzione ma purtroppo nessuna di esse è funzionante per cui ormai mi sono rassegnato e seguendo i consigli trovati nel web ho preferito creare una serie di immagini già scalate al momento dell'upload dell'immagine. Grazie lo stesso per la risposta.
 

recursio

Nuovo Utente
20
2
Per completezza, ecco l'esempio funzionante:

https://www.mercuriocloud.it/pagina.php [EDIT: pagina rimossa]

- pagina.php
- immagine.php
- test.jpg

immagine.php
PHP:
<?php
    function output_resized_image($img_path)
    {
        list($width, $height, $type, $attr) = getimagesize($img_path);
        $thumb = imagecreatetruecolor(50, 50 * $height / $width);
        if($type == 2) $source = imagecreatefromjpeg($img_path);
        elseif($type == 3) $source = imagecreatefrompng($img_path);
        imagecopyresized($thumb, $source, 0, 0, 0, 0, 50, 50 * $height / $width, $width, $height);
        if($type == 2)
        {
            header("Content-Type: image/jpg");
            $source = imagejpeg($thumb);
        }
        elseif($type == 3)
        {
            header("Content-Type: image/png");
            $source = imagepng($thumb);
        }
        imagedestroy($thumb);
    }
 
    output_resized_image($_REQUEST['img']);
?>

pagina.php
PHP:
<?php
    echo '<img src="immagine.php?img=test.jpg"><br/><img src="test.jpg">';
?>
 
Ultima modifica:
  • Mi piace
Reazioni: alemian95

alemian95

Utente Attivo
1,173
370
CPU
13600K
Dissipatore
Thermalright Peerless Assassin 120 SE
Scheda Madre
MSI PRO Z790-P WIFI ATX
HDD
WD Black 1TB SN850X
RAM
Kingston Fury Renegade DDR5 Silver 32GB 6400MT/s CL32
GPU
Gigabyte RTX 4070 Ti GAMING OC 12G
Monitor
BenQ MOBIUZ EX3415R
PSU
Thermaltake Toughpower GF3 750W
Case
NZXT H5 Flow
Periferiche
Mouse: Logitech G403 - Tastiera: Durgod Taurus K320
Net
FTTC 100 mega
OS
Windows 11 Home 64 bit
Grazie mille, questo codice paradossalmente funziona quando altri molto più completi di questo (gestivano altri tipi di immagine, la qualità di quella scalata, gestivano possibili errori) non visualizzavano niente. Comunque leggendo domande simili alla mia in forum stranieri, persone molto più esperte di me, sconsigliano fortemente questa tecnica chiamata "resize on fly" per una questione di carico di lavoro da parte del server che elabora la richiesta. Tutti consigliano di prepararsi le immagini già scalate e considerano questo metodo molto più efficace anche se si va ad occupare più spazio nel server. Terrò in ogni caso in considerazione questo codice per ogni evenienza. Grazie mille ancora, mi sei stato di grande aiuto.
 
  • Mi piace
Reazioni: recursio

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili