SetDirectory["Desktop"]

img = Import["causeway.png"];

Show[img];

Dimensions[img]

jim = Import["jim.png"];

Show[jim];

box = Import["box.png"];

Show[box];

Dimensions[box]

box[[1]] // Short

box[[2]]

box[[3]]

box[[4]]

box[[1, 4]]

box[[1, 3]]

box[[1, 2]]   (* 
      bounding rectangle of these cells in picture coordinates *)

Dimensions[box[[1, 1]]]

box[[1, 1, 3, 5]] = {255, 0, 0};

(* Display all of picture coordinate range,  
      in an image with a size 20 times normal *) 
Show[box, PlotRange -> {{0, 10}, {0, 20}}, 
        ImageSize -> 20 {10, 20}] ;

The various image sizes and coordiante systems in here are a bit confusing, mostly due to fencepost issues with the edges.
If I make the box big, then setting the PlotRange the same size as the bounding rectangle works pretty well - though there's still a tiny bit of extra whitespace in the frame.
The Mathematica default for this image is to set the PlotRange a tiny bit smaller, presumably to fix this fencepost issue; however, that messes up the image when its size is changed interactively.

getBoundingRect[png_] := 
        png[[1, 2]];
getPlotRange[png_] := png[[3, 2]];
getImageSize[png_] := png[[2, 2]];
getXY[png_, xy_] := 
        png[[1, 1, xy[[2]], 
            xy[[1]] ]];
setBoundingRect[png_, rect_] := png[[1, 2]] = 
          rect;
setPlotRange[png_, range_] := png[[3, 2]] = 
          range;
setXY[png_, xy_, 
          rgb_] := png[[1, 1, xy[[2]], xy[[1]]]] = 
          rgb;
SetAttributes[setPlotRange, HoldFirst];
SetAttributes[setBoundingRect, 
        HoldFirst];
SetAttributes[setXY, HoldFirst];
SetAttributes[getXY, HoldFirst];
SetAttributes[getBoundingRect, 
        HoldFirst];
SetAttributes[getImageSize, HoldFirst];
vectorLength[v_] := Sqrt[Total[v v]];

getPlotRange[box]

Show[img, jim];

getBoundingRect[jim]

getBoundingRect[img]

Now let's watch Jim appear from out of nowhere ...

where = {60, 10};
both = img;
Do[
Do[
pixel  =  
          getXY[jim, {x, y}]; 
other = 
          getXY[both, {x, y} + where]; 
If[
          vectorLength[{255, 255, 255} - pixel] > 
            200, 
setXY[both, {x, y} + where, 
            z pixel + (1 - z) other]]
, {x, 1, 
          37}, {y, 1, 120}]; 
Show[both,  
        ImageSize -> 2  getImageSize[both]];
, {z, 0, 
        1,  .1}]