* @version: 1.1
* @history:
* 1.0 creation
1.1 disclaimer added
*/
//Mono-image viewer
//This script uploads an image, cuts it in tiles at different zoom levels and displays results through Google Maps API tile engine
//Remove this line for your own use of this script.
//require_once('../log.php');
//Limits
ini_set('set_time_limit', 300);//5mn
ini_set('memory_limit', '256M');
define('UPLOAD_FILE_SIZE', 15e6);//15MB
define('FILE_SIZE', 90e6);//90MB - is 3 * image width * image height
define('TILE_SIZE', 256);
define('TILE_DIR', 'tiles/');
define('FIELD_SPARATOR', '_');
?>
GOOGLE MAPS API - IMAGE VIEWER
FILE_SIZE){
exit('Error: only (3 * imageWidth * imageWeight) under '.(FILE_SIZE/1000000).'MB are accepted for upload Current size:'.intval(((3*$imageX*$imageY)/1000000)).'MB.');
}
//Get required nb of tiles along the longest dimension
$maxTileDim = ceil(max($imageX, $imageY) / TILE_SIZE);
//Get max zoom level (aka zoom level with pixel dimensions containing the whole image)
$maxZoomLevel = 0;
do{
++$maxZoomLevel;
}while(pow(2, $maxZoomLevel) < $maxTileDim);
$nbMaxZoomLevelTiles = pow(2, $maxZoomLevel);
$imageRatioMaxTileX = round(ceil($imageX / TILE_SIZE) / $nbMaxZoomLevelTiles, 2);
$imageRatioMaxTileY = round(ceil($imageY / TILE_SIZE) / $nbMaxZoomLevelTiles, 2);
//Create a new dir to store tiles for current image
do{
$imageId = $maxZoomLevel.FIELD_SPARATOR.$imageRatioMaxTileX.FIELD_SPARATOR.$imageRatioMaxTileY.FIELD_SPARATOR.rand(0, 99999);
$imageTileDir = TILE_DIR.$imageId;
}while(file_exists($imageTileDir));
mkdir($imageTileDir, 0705);
if(FALSE === ($rawImage = imagecreatefromjpeg($_FILES['uploaded_file']['tmp_name']))){
exit('GD function imagecreatefromjpeg failed! line 102');
};
//Loop through zoom levels to produce tiles
for($zoom = 0; $zoom <= $maxZoomLevel; ++$zoom){
if($zoom != $maxZoomLevel){
//Resize raw image before cutting
$scale = pow(2, $maxZoomLevel - $zoom);
$newImageX = floor($imageX / $scale);
$newImageY = floor($imageY / $scale);
$srcImage = imagecreatetruecolor($newImageX, $newImageY);
if(FALSE ===imagecopyresampled($srcImage, $rawImage, 0, 0, 0, 0, $newImageX, $newImageY, $imageX, $imageY)){
exit('GD function imagecopyresampled failed!');
}
//Add a frame
imagerectangle($srcImage, 0, 0, $newImageX-1, $newImageY-1, imagecolorallocate($srcImage, 255, 255, 255));
}else{
//At max zoom level, use not resized image
$srcImage = $rawImage;
imagerectangle($srcImage, 0, 0, $imageX-1, $imageY-1, imagecolorallocate($srcImage, 255, 255, 255));
}
$zoomNbTiles = pow(2, $zoom);
//Get bottom right tile coordinates
$maxTileX = ceil($zoomNbTiles * $imageRatioMaxTileX);
$maxTileY = ceil($zoomNbTiles * $imageRatioMaxTileY);
//Loop through tiles to cut
for($X=0; $X < $maxTileX; ++$X){
for($Y=0; $Y < $maxTileY; ++$Y){
$dstImage = imagecreatetruecolor(TILE_SIZE, TILE_SIZE);
if(FALSE === imagecopy($dstImage, $srcImage, 0, 0, $X*TILE_SIZE, $Y*TILE_SIZE, TILE_SIZE, TILE_SIZE)){
exit('GD function imagecopy failed!');
}
//Save tiles on FS
if(FALSE === imagejpeg($dstImage, $imageTileDir.'/'.$zoom.'_'.$X.'_'.$Y.'.jpg', 85)){
exit('GD function imagejpeg failed! line 135');
}
imagedestroy($dstImage);
unset($dstImage);
}
}
imagedestroy($srcImage);
unset($srcImage);
//$rawImage clean up is in the last iteration
}
} else {
exit('Error: only .jpg images under '.UPLOAD_FILE_SIZE.'B are accepted for upload. Current type:'.$_FILES["uploaded_file"]["type"].' Current extension:'.$ext.' Current size'.($_FILES["uploaded_file"]["size"]/1000000).'MB');
}
} else if(isset($_GET['imageid'])){
//Want to display an already processed image
$imageId = str_replace('..', '', $_GET['imageid']);
$imageTileDir = TILE_DIR.$imageId;
if(!file_exists($imageTileDir)){
exit('Error: This imageid is not valid (maybe because it is expired) Home');
}
list($maxZoomLevel, $imageRatioMaxTileX, $imageRatioMaxTileY) = explode(FIELD_SPARATOR,$imageId);
}else{
exit('Error: No file uploaded');
}
?>
Direct access to this page: . This link will stay valid until 3.00 AM (Paris time).