If you look at the details in the documentation 3 (and know where to look), you see that each batch is compiled by a single worker (it runs the collate function that makes batches from lists of examples).
With this, you have two options to get “batch-level” processing:

Have the dataset build and return batches (this is useful also e.g. when you want to group data by size when you have varying sizes) and use with a dummy batch_size=1 in the DataLoader,
have the dataset return uncropped data and crop while copying them into a joint tensor in collate_fn (or don’t do auto batching and do it in the main loop).

Best regards
Thomas