* @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
Choose a jpg image to upload:

Tile cutting process can take up to 3mn. Be patient...

Note: Image size must be under MB and (3 * imageWidth * imageWeight) must be under MB.

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).

Status:  progess bar