I want to crop a world map on the server with PHP, according to given coordinates, and return the cropped image to be added to a web page through AJAX. I don't want to save the resulting image on the server.
My PHP code.
<?php
if (isset($_GET['lon0']) && isset($_GET['lon1']) && isset($_GET['lat0']) && isset($_GET['lat1'])) {
$lon0 = $_GET['lon0'];
$lon1 = $_GET['lon1'];
$lat0 = $_GET['lat0'];
$lat1 = $_GET['lat1'];
} else {
return 1;
}
if (isset($_GET['w'])) {
$which = 'raster/W'.$_GET['w'].'.png';
$img = imagecreatefrompng($which);
if ($img) {
$W = imagesx($img);
$H = imagesy($img);
$x = ($lon0+180)*$W/360;
$y = (90-$lat1)*$H/150;
$w = ($lon1-$lon0)*$W/360;
$h = ($lat1-$lat0)*$H/150;
$arr = array('x'=>$x,'y'=>$y,'width'=>$w,'height'=>$h);
$imgCrop = imagecrop($img,$arr);
if ($imgCrop) {
header('Content-Type: image/png');
fpassthru($imgCrop);
}
}
}
I'm getting the following error.
Modifying the code to understand what's happening:
<?php
error_reporting(E_ALL);
ini_set('display_errors',1);
if (isset($_GET['lon0']) && isset($_GET['lon1']) && isset($_GET['lat0']) && isset($_GET['lat1'])) {
$lon0 = $_GET['lon0'];
$lon1 = $_GET['lon1'];
$lat0 = $_GET['lat0'];
$lat1 = $_GET['lat1'];
} else {
return 1;
}
if (isset($_GET['w'])) {
$which = 'raster/W'.$_GET['w'].'.png';
$img = imagecreatefrompng($which);
if ($img) {
$W = imagesx($img);
$H = imagesy($img);
echo "$W x $H<br>\n";
$x = ($lon0+180)*$W/360;
$y = (90-$lat1)*$H/150;
$w = ($lon1-$lon0)*$W/360;
$h = ($lat1-$lat0)*$H/150;
$arr = array('x'=>$x,'y'=>$y,'width'=>$w,'height'=>$h);
$imgCrop = imagecrop($img,$arr);
echo is_resource($imgCrop) ? 'is resource' : 'is not';
if ($imgCrop) {
fpassthru($imgCrop);
}
}
}
I get the following output.
10800 x 4500
is resource
Warning: fpassthru(): supplied resource is not a valid stream resource in /var/www/html/sn/getImg.php on line 31
Which means the original file was read successfully, and the image was cropped. So why is fpassthru
complaining that the resource is invalid?
Try using the image* functions.
if ($imgCrop) {
header('Content-Type: image/png');
imagepng($imgCrop);
imagedestroy($imgCrop);
}
imagedestroy($img);
exit();
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.