Here’s a solution with GLMakie, although somehow it seems the zoom rectangle was broken in the last version so it’s not actually visible. Would have been cooler if the selection was actually visible.
I didn’t write the cropping and saving part but you can see where you’d put it in the code.
using GLMakie
images = randn(300, 300, 150)
fig = Figure()
i_slice = Node(1)
ax = Axis(fig[1, 1], aspect = DataAspect(), yreversed = true,
title = @lift("Slice $($i_slice)"))
hidedecorations!(ax)
chosen_slice = @lift(images[:, :, $i_slice]')
i = image!(ax, chosen_slice)
translate!(i, 0, 0, -5)
buttongrid = fig[1, 2] = GridLayout(tellheight = false)
b = Button(buttongrid[1, 1], label = "Save crop")
b2 = Button(buttongrid[2, 1], label = "Next image")
b3 = Button(buttongrid[3, 1], label = "Previous image")
on(b.clicks) do c
lims = ax.finallimits[]
println("save image cropped to $lims")
end
on(b2.clicks) do c
i_slice[] = mod1(i_slice[] + 1, 150)
autolimits!(ax)
end
on(b3.clicks) do c
i_slice[] = mod1(i_slice[] - 1, 150)
autolimits!(ax)
end
fig