A method of compressing an array of data entries in the form of digital electronic signals, the method comprising the steps of: (a) providing an original data array to be compressed; (b) dividing the original data array into macroblocks, and dividing the macroblocks into blocks of one or more sizes, wherein each block may be the macroblock as a whole or a division of the macroblock; (c) calculating for each block of the original data array a respective plurality of possible compressed encodings using a respective different compression technique for each encoding of the respective block, wherein each possible compressed encoding in the respective pluralities of possible compressed encodings has an associated respective data size and respective reconstruction error; (d) initialising a compressed encoding of the original data array, which compressed encoding of the original data array is a combination of the possible compressed encodings calculated in step (c) and which when uncompressed corresponds to a reference data array which is an initial approximation to the original data array, wherein the compressed encoding of the original data array has an associated first data size and first reconstruction error, representing a quantitative difference between the original data array and the reference data array; (e) generating a list of the possible compressed encodings calculated in step (c) and selecting that one of the possible compressed encodings from the list which, when added to the compressed encoding of the original data array, provides the largest relative improvement in reconstruction error per unit increase in data size; (f) in a first iteration: updating the compressed encoding of the original data array generated in step (d) by adding the compressed encoding selected in step (e), and updating the reference data array generated in step (d); and in subsequent iterations: updating the compressed encoding of the original data array generated in the previous iteration of step (f) by adding the compressed encoding selected in step (e), and updating the reference data array generated in the previous iteration of step (f); and (g) recursively repeating steps (e) and (f) until a maximum data size within a specific data size budget is achieved for the compressed encoding of the original data array. (a) providing an original data array to be compressed; (b) dividing the original data array into macroblocks, and dividing the macroblocks into blocks of one or more sizes, wherein each block may be the macroblock as a whole or a division of the macroblock; (c) calculating for each block of the original data array a respective plurality of possible compressed encodings using a respective different compression technique for each encoding of the respective block, wherein each possible compressed encoding in the respective pluralities of possible compressed encodings has an associated respective data size and respective reconstruction error; (d) initialising a compressed encoding of the original data array, which compressed encoding of the original data array is a combination of the possible compressed encodings calculated in step (c) and which when uncompressed corresponds to a reference data array which is an initial approximation to the original data array, wherein the compressed encoding of the original data array has an associated first data size and first reconstruction error, representing a quantitative difference between the original data array and the reference data array; (e) generating a list of the possible compressed encodings calculated in step (c) and selecting that one of the possible compressed encodings from the list which, when added to the compressed encoding of the original data array, provides the largest relative improvement in reconstruction error per unit increase in data size; (f) in a first iteration: updating the compressed encoding of the original data array generated in step (d) by adding the compressed encoding selected in step (e), and updating the reference data array generated in step (d); and in subsequent iterations: updating the compressed encoding of the original data array generated in the previous iteration of step (f) by adding the compressed encoding selected in step (e), and updating the reference data array generated in the previous iteration of step (f); and updating the compressed encoding of the original data array generated in step (d) by adding the compressed encoding selected in step (e), and updating the reference data array generated in step (d); and in subsequent iterations: updating the compressed encoding of the original data array generated in the previous iteration of step (f) by adding the compressed encoding selected in step (e), and updating the reference data array generated in the previous iteration of step (f); and updating the compressed encoding of the original data array generated in the previous iteration of step (f) by adding the compressed encoding selected in step (e), and updating the reference data array generated in the previous iteration of step (f); and (g) recursively repeating steps (e) and (f) until a maximum data size within a specific data size budget is achieved for the compressed encoding of the original data array.