Skip to content

Unexpected behavior with default_coords in st_cropper #29

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
webtin opened this issue May 2, 2024 · 0 comments
Open

Unexpected behavior with default_coords in st_cropper #29

webtin opened this issue May 2, 2024 · 0 comments

Comments

@webtin
Copy link

webtin commented May 2, 2024

Hello streamlit-cropper team,

I noticed some unexpected behavior, when I was trying to make the selection box persistant.
I used the return_Type="both" option in the st_cropper function to get the coordinates, than stored them is an st_session_state variable, with the goal to use them in the default_coords option.

I also had to do some conversions to match the output coordinates with the input coordinates in convert_coordinates_dict_to_tuple.

When I do this the selection box seems to be stuck every second time I move the box. I expected the cropper function to take the stored coordinates as the coordinates to place the box. So I'm kind of stuck here and have no idea, why it works every second time.

Background: I do some manipulations on the image thats meant to be cropped. When the image changes, the st_cropper functions gets called again and resets the coordinates.

Also I'm kind if new to programming, so it might be that I just overlooked something here. Also this is my first Issue on GitHub. So just let me know if I could improve.

Thank you for your support.

Here is the code example to reproduce the behavior:

import streamlit as st
from streamlit_cropper import st_cropper
from PIL import Image

def convert_coordinates_dict_to_tuple(data):
    left = data['left'] + 2
    top = data['top'] + 2
    width = data['width']
    height = data['height']
    right = left + width + 4
    bottom = top + height + 4
    return (left, right, top, bottom)

# Upload an image and set some options for demo purposes
st.header("Cropper Demo")

image = st.file_uploader("Upload Your Image", type=['jpg', 'png', 'jpeg'], accept_multiple_files=False)

if image:
    img_file = Image.open(image)

    # check if coordinates already available, if not use cropper box algorythm
    if 'coordinates' in st.session_state:
        print("coordinates already available")
        print("before moving",st.session_state.coordinates)
        cropped_img, st.session_state.coordinates= st_cropper(img_file, realtime_update=True, box_color='#0000FF', return_type="both", default_coords=st.session_state.coordinates)
        st.session_state.coordinates = convert_coordinates_dict_to_tuple(st.session_state.coordinates)
        print("after moving ", st.session_state.coordinates)

    else:
        print("no coordinates")
        cropped_img, st.session_state.coordinates = st_cropper(img_file, realtime_update=True, box_color='#0000FF', return_type="both")
        st.session_state.coordinates = convert_coordinates_dict_to_tuple(st.session_state.coordinates)
        print("new coordinates", st.session_state.coordinates)

    st.image(cropped_img)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant