JSFiddle - React, Tailwind, and code Playground

HTML

<div class="container">
  <img class="image" src="http://paper.bl.ee/images/layer1.png">
</div>

CSS

.container {
  position: absolute;
  top: 0;
  right: 0;
  bottom: 0;
  left: 0;
  overflow: hidden;
}

  .image {
    vertical-align: middle;
  }

JavaScript

$(function() {

  "use strict";



  var container = document.querySelector(".container"),
      image = document.querySelector(".image"),
      primaryDirection,
      secondaryDirection;



  $(window).on("load resize", function() {
    updatePrimaryDirection();

    switch (primaryDirection) {
      case "horizontal":
        image.style.width = "100%";
        image.style.height = "";
        break;
      case "vertical":
        image.style.width = "";
        image.style.height = "100%";
        break;
    }
  });

  setInterval(function() {
    var method;

    updateSecondaryDirection();

    switch (primaryDirection) {
      case "horizontal":
        method = "scrollTop";
        break;
      case "vertical":
        method = "scrollLeft";
        break;
    }

    switch (secondaryDirection) {
      case "positive":
        container[method] += 1;
        break;
      case "negative":
        container[method] -= 1;
        break;
    }
  }, 20);



  function updatePrimaryDirection() {
    var containerRatio = container.offsetWidth / container.offsetHeight,
        imageRatio = image.naturalWidth / image.naturalHeight;

    if (containerRatio > imageRatio) {
      primaryDirection = "horizontal";
    } else {
      primaryDirection = "vertical";
    }
  }

  function updateSecondaryDirection() {
    var progress,
        min,
        max;

    switch (primaryDirection) {
      case "horizontal":
        progress = container.clientHeight + container.scrollTop;
        min = container.clientHeight;
        max = container.scrollHeight;
        break;
      case "vertical":
        progress = container.clientWidth + container.scrollLeft;
        min = container.clientWidth;
        max = container.scrollWidth;
        break;
    }

    switch (progress) {
      case min:
        secondaryDirection = "positive";
        break;
      case max:
        secondaryDirection = "negative";
        break;
    }
  }

});