It depends on how much customization you want. With a small number of customization options (for example - 3 options for eye, hair and clothes), you could simply prepare all combinations as images (3 options for 3 customizations would mean 3*3*3=27 images).
For more complexity, you will need to combine the images on the fly.
Menu example to store eye selection:
$ hair = "green"
$ hair = "blue"
Example of the fuction that displays the customized sprite:
# TODO: add if-sentences to display selected clothes
# if-sentences to display selected hair:
if hair == "blue":
show hair blue
if hair == "green":
show hair green
# TODO: add if-sentences to display selected eyes
To display the customized sprite, you use:
This example is not the most elegant solution. It simply displays the images on top of each other. A better method would be to prepare the combined image first and display it once, but I'm not that experienced with Ren'Py yet...
To ensure the parts (eyes, hair, ...) are in the right locations, you can either position them in Ren'Py, but I think it's better if you save all the images from your photo editor so they fit (the hair, eyes, ... images should be the same size than the base sprite).
If a CG is a background + sprite(s), it shouldn't change anything. You just display the BG for the CG and the custom sprite on top of it (using the same code/function or a copy of it, with different images). But for more complex (action) CGs, this could mean a lot of extra resources...