A few simple tweaks of @Heike's answer to this question gets you most of the way there.
ImageZoom[img_Image] :=
DynamicModule[{range,range0,range1,ref,ref2,fac=.7,z=.9,dim,y,aspect,xaspect=1},
dim = ImageDimensions@img;
aspect = 1.*Divide@@dim;
If[aspect>1, xaspect = aspect];
range = range0 = {{0,xaspect}, {0,1}};
EventHandler[Graphics[{Inset[Image[img], {0,0}, {0,0}, aspect]},
PlotRange->Dynamic[range], ImageSize->500],{
"MouseDown" :> (ref=MousePosition["GraphicsImageScaled"];
range0=range;ref2=MousePosition["Graphics"];),
"MouseDragged" :> Which[
CurrentValue["ShiftKey"],
y = MousePosition["GraphicsImageScaled"][[2]]-ref[[2]];
If[y>0, range=(range-ref2)*(z-y)+ref2,(*zoom in*)
If[y<0, range=(range-ref2)/(z+y)+ref2]];,(*zoom out*)
True,
(range=range0+(ref-MousePosition["GraphicsImageScaled"])(range0[[All,2]]-range0[[All,1]]));
],
"MouseClicked" :> Which[
CurrentValue["ControlKey"], range={{0,xaspect},{0,1}},(*Back to start*)
CurrentValue["ShiftKey"],(*zoom out*)
range=(range-MousePosition["Graphics"])/fac+MousePosition["Graphics"];,
True,(*zoom in*)
range=(range-MousePosition["Graphics"])*fac+MousePosition["Graphics"];
]},Method->"Preemptive"]
]
Applying the above function to an Image
gives you both click-and-drag panning and zoom.
To zoom in:
- Hold shift and drag up
- or just click anywhere
To zoom out:
- Hold shift and drag down
- or just shift click anywhere

However, the frontend starts grinding to a halt on large images:

EventHandler
has access to any mouse-wheel actions. That's the main reason this won't work. You could always do a control-mouse drag though, likeGraphics3D
$\endgroup$ – b3m2a1 Dec 20 '17 at 8:32ctrl+click
to shrink image. $\endgroup$ – yode Dec 20 '17 at 9:10