diff --git a/src/ImageView.jl b/src/ImageView.jl index 121ef1c..2cb3f76 100644 --- a/src/ImageView.jl +++ b/src/ImageView.jl @@ -110,8 +110,9 @@ function imshow!(canvas::GtkObservables.Canvas{UserUnit}, imgsig::Observable, zr::Observable{ZoomRegion{T}}, annotations::Annotations=annotations()) where T<:RInteger + pyr = ImagePyramid(imgsig) draw(canvas, imgsig, annotations) do cnvs, image, anns - copy_with_restrict!(cnvs, image) + copy_with_restrict!(cnvs, pyr) set_coordinates(cnvs, zr[]) draw_annotations(cnvs, anns) end @@ -122,8 +123,9 @@ function imshow!(frame::Union{GtkFrame,GtkAspectFrame}, imgsig::Observable, zr::Observable{ZoomRegion{T}}, annotations::Annotations=annotations()) where T<:RInteger + pyr = ImagePyramid(imgsig) draw(canvas, imgsig, annotations) do cnvs, image, anns - copy_with_restrict!(cnvs, image) + copy_with_restrict!(cnvs, pyr) set_coordinates(cnvs, zr[]) set_aspect!(frame, image) draw_annotations(cnvs, anns) @@ -137,8 +139,9 @@ end function imshow!(canvas::GtkObservables.Canvas, imgsig::Observable, annotations::Annotations=annotations()) + pyr = ImagePyramid(imgsig) draw(canvas, imgsig, annotations) do cnvs, image, anns - copy_with_restrict!(cnvs, image) + copy_with_restrict!(cnvs, pyr) set_coordinates(cnvs, axes(image)) draw_annotations(cnvs, anns) end @@ -148,21 +151,41 @@ end function imshow!(canvas::GtkObservables.Canvas, img::AbstractMatrix, annotations::Annotations=annotations()) + pyr = ImagePyramid(img) draw(canvas, annotations) do cnvs, anns - copy_with_restrict!(cnvs, img) + copy_with_restrict!(cnvs, pyr) set_coordinates(cnvs, axes(img)) draw_annotations(cnvs, anns) end nothing end -function copy_with_restrict!(cnvs, img::AbstractMatrix) - imgsz = size(img) +# cache of the image plus downscaled versions +ImagePyramid(img::AbstractMatrix) = Any[img] + +function ImagePyramid(img::Observable) + pyr = Any[img[]] + on(img) do image + push!(empty!(pyr),image) + end + pyr +end + +function get_image(p, i) + while length(p) 2*Graphics.height(cnvs) && imgsz[2] > 2*Graphics.width(cnvs)) - img = restrict(img) - imgsz = size(img) + i=i+1 + imgsz = size(get_image(p,i)) end - copy!(cnvs, img) + copy!(cnvs, get_image(p, i)) end """