psychopy.org | Reference | Downloads | Github

Incorrect coordinates for bounding rect in BufferImageStim?

Hi all, hope you good people can help me figure out if the behavior of BufferImageStim reflects a bug, or if I am doing it wrong.

Long story short, I am developing a somewhat visually complex and interactive experiment, and want to give participants visual feedback so they can compare their solution with the correct one. So, I thought a good approach would be taking a “screenshot” of their finished product using BufferImageStim and then displaying this side by side with the correct one.

But, I’m having a hard time figuring out how to use the rect argument to “screenshot” a specific region. The documentation here says the rect argument should be “a list of edges [left, top, right, bottom] defining a screen rectangle which is the area to capture from the screen, given in norm units”. Unfortunately, this seems to be wrong, or I don’t understand the description.

Consider the example below. I would expect setting rect= [-1, 1, 1, 0] to capture the top half of the window, but it appears that the opposite is happening, and it’s capturing the bottom half?

from psychopy import visual, event

win = visual.Window()

im = visual.ImageStim(win, image="face.jpg")  # face.jpg is attached, it's the same one that comes with the coder demos
instructions = visual.TextStim(win, pos=(0, -.75), text="Press any key to screenshot upper half of window")
border = visual.Line(win, start=(-1, 0), end=(1, 0))  # Horizontal midline to divide top and bottom half

border.draw()
im.draw()
instructions.draw()

win.flip()
event.waitKeys()

shot = visual.BufferImageStim(win, stim=[im], rect=[-1, 1, 1, 0])
instructions.text = "Press any key to close the window"

win.color = (-1, 0, 0)  # change background so screenshot region is distinguishable
win.flip()

border.draw()
shot.draw()
instructions.draw()
win.flip()
event.waitKeys()

Any help understanding this is appreciated! Here is the link to face.jpg, it’s the same file that comes with the coder demos.

It does seem like the argument description is incorrect. I can get it to capture the top half if I use rect=[-1, 0, 1, -1].