How do I best tile a large image?

Questions and postings pertaining to the usage of ImageMagick regardless of the interface. This includes the command-line utilities, as well as the C and C++ APIs. Usage questions are like "How do I use ImageMagick to create drop shadows?".
Post Reply
pcreso

How do I best tile a large image?

Post by pcreso »

Hi,

I have a 450Mb png I want to tile, so I have a 10x10 set of images which make up the original (for a web mapping application).

I tried -crop but the resulting png files failed to display, giving an error about image offest being wrong & the image was outside the area displayed.

I then tried a jpg, but was unable to get zero quality loss, even with -quality 100

The next attempt was a tif output, but I seem to have got a single large tif image built up from the tif tiles instead of the separate image files (at least that is what it looks like from identify's output)

So, any suggestions as to how to best tile the large image, or how to extract the tiff tiles from the composite image?

Thanks,

Brent Wood
User avatar
magick
Site Admin
Posts: 11064
Joined: 2003-05-31T11:32:55-07:00

Post by magick »

Try -crop again but add +repage after it so your PNG images will display properly.
pcreso

Post by pcreso »

Perfect! Appreciated. I'll post a URL of the mapserver site soon so you can appreciate the results of IM on some 2Gb of mosaiced satellite imagery!

Thanks,

Brent
pcreso

Post by pcreso »

Hi,

Appended the script I ran....

To see 3 layers using the images,see

http://203.97.249.147/map_nz/map0.html

click on NZ & zoom in to New Zealand (turn the layers on in the LHS list first) for some local detail in addition to the global imagery :-)

Cheers,

Brent

Code: Select all

#! /bin/bash
# script to tile high res global images


LIST="A1 A2 B1 B2 C1 C2 D1 D2"

for TEXT in $LIST  ; do
  MAP=world.topo.bathy.200407.3x21600x21600.${TEXT}.png
  if [ ! -r tile_${TEXT}.png.0 ] && [ ! -r tile_${TEXT}_00.png ] ; then
    echo "Tiling $MAP"
    convert $MAP -crop 2160x2160! +repage tile_${TEXT}.png
  else
    echo "$MAP already tiled"
  fi

  #rename files if required
  echo "Renaming new tiles if required"
  if [ -r tile_${TEXT}.png.0 ] ; then
    echo "Renaming tiles...."
    rm -f files.txt
    ls tile_${TEXT}.png.* > files.txt
    while read FILE ; do
      TILE_NO=`echo "$FILE" | cut -f3 -d"."`
      TILE_NAME=`echo "$FILE" | cut -f1 -d"."`
      if [ $TILE_NO -le 9 ] ; then
        TILE_NO=0$TILE_NO
      fi
      NEW_NAME=${TILE_NAME}_${TILE_NO}.png
      echo "renaming $FILE to $NEW_NAME"
      mv $FILE $NEW_NAME
    done < files.txt
  fi
done

#write world files....
#A1 origin=180, 90
#B1 origin=270, 90
#C1 origin=0,   90
#D1 origin=90,  90
#all x2 files have Y origin of 0, same x origin

X_PIXEL=0.004166666667
Y_PIXEL=-0.004166666667

echo "generating world files"

for TEXT in $LIST ; do
  rm -f files.txt

  ls tile_${TEXT}*.png > files.txt

  if [ "$TEXT" = "A1" ] ; then
    X_ORIGIN=180
    Y_ORIGIN=90
  elif [ "$TEXT" = "A2" ] ; then
    X_ORIGIN=180
    Y_ORIGIN=0
  elif [ "$TEXT" = "B1" ] ; then
    X_ORIGIN=270
    Y_ORIGIN=90
  elif [ "$TEXT" = "B2" ] ; then
    X_ORIGIN=270
    Y_ORIGIN=0
  elif [ "$TEXT" = "C1" ] ; then
    X_ORIGIN=0
    Y_ORIGIN=90
  elif [ "$TEXT" = "C2" ] ; then
    X_ORIGIN=0
    Y_ORIGIN=0
  elif [ "$TEXT" = "D1" ] ; then
    X_ORIGIN=90
    Y_ORIGIN=90
  elif [ "$TEXT" = "D2" ] ; then
    X_ORIGIN=90
    Y_ORIGIN=0
  fi

  while read FILE ; do
    PREFIX=`echo "$FILE" | cut -f1 -d"."`
    PGW=${PREFIX}.pgw
    echo "Writing $PGW for $FILE"

    ROW=`echo "$FILE" | cut -f3 -d"_" | cut -b1`
    COL=`echo "$FILE" | cut -f3 -d"_" | cut -b2`
    echo " using row $ROW    column $COL"

    # get each new tile origin
    X_TILE=`echo "1.000000000000 * $X_ORIGIN + ( $COL * 9.0 )" | bc`
    Y_TILE=`echo "1.000000000000 * $Y_ORIGIN - ( $ROW * 9.0 )" | bc`
    echo "  Origin: $X_TILE   $Y_TILE"

    rm -f $PGW

    echo "$X_PIXEL"  >  $PGW
    echo "0"         >> $PGW
    echo "0"         >> $PGW
    echo "$Y_PIXEL"  >> $PGW
    echo "$X_TILE" >> $PGW
    echo "$Y_TILE" >> $PGW


  done < files.txt
done
ladyanne

Re: How do I best tile a large image?

Post by ladyanne »

what did the script do ??

and how to use it
User avatar
anthony
Posts: 8883
Joined: 2004-05-31T19:27:03-07:00
Authentication code: 8675308
Location: Brisbane, Australia

Re: How do I best tile a large image?

Post by anthony »

to discover the basics of cropping an image into multiple tile see
http://www.imagemagick.org/Usage/crop/#crop_tile
Anthony Thyssen -- Webmaster for ImageMagick Example Pages
https://imagemagick.org/Usage/
ladyanne

Re: How do I best tile a large image?

Post by ladyanne »

thanks i read it

i crop my image it is not a problem

but this is big image so pb in not the same i need to name it XX_YY.jpg or XX_YY.png

this my probleme to use the small image

but thank for your answer
Post Reply