# (12) Image and Grid Manipulations

We again use grdmix, blending the NASA day and night views from the Blue and Black Marble mosaic images, but here we recompute a day-night mask for every 1 minute in a single day, for 1440 frames. In addition, we adjust the colors using the intensities derived from the slopes of the earth relief grid. Since no GMT plot is made here we do not use movie but instead use batch to build the images and then create the movie directly from the set of PNG HD images.

    #!/usr/bin/env bash
    #
    # Blending the NASA day and night views from the Blue and Black Marble mosaic
    # images using a day-night mask that goes through a full 24-hour cycle.  In addition,
    # we adjust the colors using the intensities derived from the slopes of the earth
    # relief grid.  We spin around at 24 frames per second where each frame advances by 1 minute.
    # Because we are not plotting anything, just manipulating images via grids, we must instead
    # create the frames and the final movie via the batch module.
    #
    # DEM:    @earth_relief_04m
    # Images: @earth_day_HD.tif @earth_night_HD.tif from the GMT cache server
    #
    # The finished movie is available in our YouTube channel as well:
    # https://youtu.be/X8TojLs0NYk
    # The movie took ~4 minutes to render on a 24-core MacPro 2013.
    # To make a UHD (4k) movie, comment/uncomment the SIZE, INC and FILT settings
    cat << 'EOF' > inc.sh
    SIZE=HD
    INC=11.25
    FILT=21
    # SIZE=UHD
    # INC=5.625
    # FILT=10.5
    EOF
    # 1. Create preflight script to build data files needed in the loop
    cat << 'EOF' > pre.sh
    gmt begin
      # Set view time for June 20-21, 2020 with steps of 1 minute
      gmt math -T2020-06-20T/2020-06-21T/1 -o0 --TIME_UNIT=m  T = times.txt
      # Create a ${SIZE} DEM at ${INC}x${INC} arc minutes to yield ${SIZE} dimensions
      gmt grdfilter @earth_relief_04m -Fg${FILT} -I${INC}m -D1 -r -Gtopo_${SIZE}.grd
      # Create an intensity grid based on the ${SIZE} DEM so we can see structures in the oceans
      gmt grdgradient topo_${SIZE}.grd -Nt0.5 -A45 -Gintens_${SIZE}.grd
      # Make sure our remote files have been downloaded
      gmt which -Ga @earth_day_${SIZE}.tif @earth_night_${SIZE}.tif
    gmt end
    EOF
    # 2. Set up main script
    cat << 'EOF' > main.sh
    gmt begin
      # Let HSV minimum value go to zero and faint map border
      gmt set COLOR_HSV_MIN_V 0 MAP_FRAME_PEN=faint
      # Make global grid with a smooth 2-degree day/night transition for this time.
      gmt grdmath -Rd -I${INC}m -r $(gmt solar -C -o0:1 -I+d${BATCH_COL0}) 2 DAYNIGHT = daynight_${SIZE}.grd
      # Blend the day and night Earth images using the weights, so that when w is 1
      # we get the daytime view, and then adjust colors based on the intensity.
      gmt grdmix @earth_day_${SIZE}.tif @earth_night_${SIZE}.tif -Wdaynight_${SIZE}.grd -Iintens_${SIZE}.grd -G${BATCH_NAME}.png -Ve
    gmt end
    EOF
    # 3. Create postflight script to build movie from the images
    cat << 'EOF' > post.sh
    gmt begin
      prec=$(gmt math -Q ${BATCH_NJOBS} LOG10 CEIL =)
      ffmpeg -loglevel warning  -f image2 -framerate 24 -y -i "${BATCH_PREFIX}_%0${prec}d.png" -vcodec libx264 -pix_fmt yuv420p ${BATCH_PREFIX}_${SIZE}.mp4
      rm -f ${BATCH_PREFIX}_*.png
    gmt end
    EOF
    # 4. Run the batch, requesting a fade in/out via white
    gmt batch main.sh -Iinc.sh -Sbpre.sh -Sfpost.sh -Ttimes.txt -Nanim12 -V -W -Zs