get image from url and display it

Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
snd
Mesaje:9

get image from url and display it

Salut, doresc să i-au o imagine din url și să o afișez. Până acum am ajuns la rezultatul de mai jos dar am anumite probleme.
1) doresc să nu salveze imaginea in cache (cred că am rezolvat această problemă, dar nu sunt sigur)
2) doresc doar jpg/png/gif să fie valide, pentru restul extensiilor să dea o eroare
3) vreau ca în cazul în care imaginile au background transparent să fie transparent, momentan nu apare transparent
4) în cazul imaginilor .gif animate, animația nu merge (știu că gd nu suportă animații, dar nu știu altă metodă)

Cod: Selectaţi tot

<?php
$url = $_GET['url'];

$allowed = array('jpg','gif','png');
$extension = pathinfo($url, PATHINFO_EXTENSION);

if(in_array($extension, $allowed)){
$ch = curl_init();
$timeout = 0;
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);

$image = curl_exec($ch);
curl_close($ch);

if ($extension == 'jpg' || $extension == 'jpeg') {
header("Content-type: image/jpeg");
}
else if ($extension == 'png') {
header("Content-type: image/png");
}
else if ($extension == 'gif') {
header("Content-type: image/gif");
}

$im = imagecreatefromstring($image);

$tw = imagesx($im);
$th = imagesy($im);

if ($extension == 'jpg' || $extension == 'jpeg') {
imagealphablending($im,TRUE);
imagejpeg($im, NULL, 100);
}
else if ($extension == 'png') {
imagealphablending($im,TRUE);
imagepng($im, NULL, 9, PNG_ALL_FILTERS);
}
else if ($extension == 'gif') {
imagegif($im);
}

//imagealphablending($im,TRUE);
//imagepng($im, NULL, 9, PNG_ALL_FILTERS);
//imagejpeg($im, NULL, 100);
imagedestroy($im);
}
?>
Sunt începător în domeniu, pe net am găsit informații cât să fac ceea ce am făcut până acum, sigur sunt informații și pentru ceea ce vreau dar nu știu cum să mă folosesc de ele, de aceea vă cer ajutorul vouă! :D

MarPlo Mesaje:4343
Salut
Daca imaginea exista deja la acea adresa, o poti adauga si afisa direct in tag <img>.

Cod: Selectaţi tot

$url = $_GET['url'];

$allowed = array('jpg','gif','png');
$extension = pathinfo($url, PATHINFO_EXTENSION);

if(in_array($extension, $allowed)){
  $re = '<img src="'. $url .'" alt="Image" />';
}
else $re = 'Not allowed extension: '. $extension;

echo $re;

snd Mesaje:9
nu vreau sa o afisez ca atare pe o pagina, vreau doar sa se afiseze imaginea in felul urmator
https:// site.ro/images.php?url=http://site2.ro/imagine.png

Vreau asta deoarece pe forum sunt postate foarte multe imagini externe de pe site-uri fara certificat ssl, iar ca sa nu mai primesc acel avertisment "pagina contine elemente mixte, si https si http", vreau sa preiau imaginile asa si sa se afiseze ca si cum aia ar fi adresa unei imagini.

Scriptul facut de mine functioneaza, dar are erorile prezentate mai sus.. as dori putin ajutor cu ele.

MarPlo Mesaje:4343
Din ce am citit pe internet, php nu detecteaza daca o imagine are background transparent. Pentru asta ar trebui o functie care sa parcurga fiecare pixel, sa verifice codul de culoare si sa aplice la fiecare imagecolortransparent().
Dar ca sa preiei cu php o imagine de la o adresa externa si sa o afisezi in pagina, se poate usor cu base64 (indiferent daca e cu background transparent si gif animat).
Exemplu:

Cod: Selectaţi tot

$url = $_GET['url'];

$allowed = array('jpg','gif','png');
$extension = pathinfo($url, PATHINFO_EXTENSION);

if(in_array($extension, $allowed)){
  $ch = curl_init();
  curl_setopt ($ch, CURLOPT_URL, $url);
  curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, 0);

  curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
  curl_setopt($ch, CURLOPT_BINARYTRANSFER, 1);

  // get image data as string
  $img = curl_exec($ch);
  curl_close($ch);

  // Format the image SRC:  data:{mime};base64,{img_data_base64};
  $src = 'data:image/'. $extension .';base64,'. base64_encode($img);

  // add the base64 image into a <img> to display it
  $re = '<img src="'. $src .'" alt="Image" />';
  $img = $src = '';  // to free memory
}
else $re = 'Not allowed extension: '. $extension;

echo $re; 
Reversu e ca base64 va mari datele imaginii cu 33%, dar e OK chiar si pentru imagini de cativa MB.

- Sau poti salva imaginea intr-un director pe server, cu file_put_contents(), si o afisezi cu adresa de acolo.