I've never tried this way. Did you scan it in, resize and open in ZX-Paint to finish?

No. I built an Excel spreadsheet for the whole screen, manually input each pixel as a 1 or 0 and used formulae to convert these into a string of values for 0x4000 and beyond (I hope I got that right). I did something similar for the attributes.

In the past when I have used graph paper to design UDG and graphics, at first I always manually calculated the decimal value to enter into the Spectrum. Soon after, I started to use a scientific calculator that has binary, hexadecimal and of course decimal modes. Much easier
Now I have an iPad app. and computer based calculators that can convert binary to hexadecimal or decimal.

The trouble with using spreadsheets, is that not all formats/versions support the binary and hexadecimal operators/functions
My experience is from a few years ago, so maybe things have moved forward.

In the past when I have used graph paper to design UDG and graphics, at first I always manually calculated the decimal value to enter into the Spectrum. Soon after, I started to use a scientific calculator that has binary, hexadecimal and of course decimal modes. Much easier
Now I have an iPad app. and computer based calculators that can convert binary to hexadecimal or decimal.

The trouble with using spreadsheets, is that not all formats/versions support the binary and hexadecimal operators/functions
My experience is from a few years ago, so maybe things have moved forward.

Mark

Google Sheets covers this very well now, and its the option I use when I'm not feeling retro!

HEX2DEC: Converts a signed hexadecimal number to decimal format.
HEX2BIN: Converts a signed hexadecimal number to signed binary format.
DEC2HEX: Converts a decimal number to signed hexadecimal format.
DEC2BIN: Converts a decimal number to signed binary format.
BIN2HEX: Converts a signed binary number to signed hexadecimal format.
BIN2DEC: Converts a signed binary number to decimal format.