If you must, you can use a pearl regex where the dot match includes newlines. For example, using ag:
ag '(?s)<block(?!.*?picture).*?</block>'
This will return the contents between the block tags which span multiple lines while excluding blocks which contain the picture tag between those two block tags.
The (?s) means the . matches include newlines.
The ?! is a negative look ahead, in this case for the word 'picture'
The *? is a non-greedy search until the first picture and first block.
Note: I'm sure there are corner cases where this search pattern won't work, but my quick test worked well.
If you wish to further limit the results to just the IDs, pipe another ag to your result:
ag '(?s)<block(?!.*?picture).*?</block>' <directory with files> | ag -o 'id="([0-9]+)"'