A very quick primer on ZX81 HiRes Graphics
The ZX81 was a character based computer and from BASIC you were allowed to print those characters within a 32x22 grid
(there were 2 more lines at the bottom of the screen but they were reserved)
However... it turns out that it's possible to trick the ULA into thinking it is always drawing the top line of a character for each horizontal line it displays. Which allows you to create pseudo Hires Graphics on the ZX81.
In effect, you can take any 256x192 black and white image and display it, or a close approximation of it, on a standard ZX81.
As you might suspect, it's a little bit more complicated than that...
Making the ULA think that it;s always drawing the top line of a character (for each line it displays) gives you 192 pixels vertically to play with. However, each 8 pixel 'block' it draws horizontally still has to be a 'bit pattern' read somewhere from within the ZX81's 8K ROM.
There can only be 256 of these horizontal 'bit patterns' and they must be read from the ZX81's ROM.
This means you can't just create a bunch of bit patterns in memory and then display them. You have to take an image and find the best match of bit patterns you can within the 8K ROM.
And not just anywhere in the ROM, they must all be within a 2K block with each of the 256 bit patterns being 8 bytes apart.
Note that you can use RAM based patterns on an unexpanded (1K) ZX81, but that introduces other limitations, namely only 1K of memory to write anything in.
For some essential further reading about ZX81 Hires displays, take a look at Wilf Rigter's in depth description of the ZX81 Video Display System and Steven McDonald's Hires Routine