Help in Understanding and learning steganography using Python

Hello every one, I need a help if you don’t mind in understanding the following code, i am beginner in python so pardon me. So far its clear that in this code we defined encode message which is based on main image ,secret message, and surely file name. its clear that image size is based on W*H and secret message should be less than size of main image and that’s logically true . The problem here i cant well understand its algorithm related to pixels. if could someone elaborate the idea behind this code. Thank you.

from PIL import ImageTk, Image
import math
import os



def encodeMessage(image, msg, fileName):
    msg = "." + msg
    width, height = image.size
    if (width * height) < len(msg):
        raise ValueError
    pixels = image.load()
    for i in range(0, len(msg)):
        encodedChar = str(ord(msg[i]))
        row = math.ceil(i/float(width))
        column = i%width
        pixel = pixels[row-1, column-1]
        newPixel = list(pixel)
        newPixel[0] = str(newPixel[0])
        newPixel[1] = str(newPixel[1])
        newPixel[2] = str(newPixel[2])

        if ord(msg[i]) >= 100:
            r = list(newPixel[0])
            r[-1] = encodedChar[0]
            newPixel[0] = ''.join(r)

            r = list(newPixel[1])
            r[-1] = encodedChar[1]
            newPixel[1] = ''.join(r)

            r = list(newPixel[2])
            r[-1] = encodedChar[2]
            newPixel[2] = ''.join(r)

        elif ord(msg[i]) >= 10:
            r = list(newPixel[0])
            r[-1] = '0'
            newPixel[0] = ''.join(r)

            r = list(newPixel[1])
            r[-1] = encodedChar[0]
            newPixel[1] = ''.join(r)

            r = list(newPixel[2])
            r[-1] = encodedChar[1]
            newPixel[2] = ''.join(r)

        else:
            r = list(newPixel[0])
            r[-1] = '0'
            newPixel[0] = ''.join(r)

            r = list(newPixel[1])
            r[-1] = '0'
            newPixel[1] = ''.join(r)

            r = list(newPixel[2])
            r[-1] = encodedChar[0]
            newPixel[2] = ''.join(r)


        newPixel[0] = int(newPixel[0])
        newPixel[1] = int(newPixel[1])
        newPixel[2] = int(newPixel[2])
        pixels[row-1, column-1] = tuple(newPixel)
    row = math.ceil(len(msg)/float(width))
    column = len(msg)%width
    pixel = pixels[row, column]
    newPixel = list(pixel)
    newPixel[0] = str(newPixel[0])
    newPixel[1] = str(newPixel[1])
    newPixel[2] = str(newPixel[2])

    r = list(newPixel[0])
    r[-1] = '1'
    newPixel[0] = ''.join(r)
    
    r = list(newPixel[1])
    r[-1] = '2'
    newPixel[1] = ''.join(r)

    r = list(newPixel[2])
    r[-1] = '7'
    newPixel[2] = ''.join(r)



    newPixel[0] = int(newPixel[0])
    newPixel[1] = int(newPixel[1])
    newPixel[2] = int(newPixel[2])
    pixels[row-1, column-1] = tuple(newPixel)
    image.save("./export/" + fileName)


def decodeMessage(image):
    pixels = image.load()
    encodedText = ""
    for w in range(0, image.size[0]):
        for h in range(0, image.size[1]):
            pixel = pixels[w,h]
            encodedChar = int(str(pixel[0])[-1]) * 100 + int(str(pixel[1])[-1]) * 10 + int(str(pixel[2])[-1])
            if(encodedChar == 127):
                return encodedText
            else:
                encodedText+=chr(encodedChar)
    return encodedText

if __name__== "__main__":
    while True:
        choice = input("Decode or encrypt? (d/e): ")
        while not(choice == 'd' or choice == 'e'):
            print("\n[ERROR] Invalid choice, please input 'd' or 'e'!")
            choice = input("\nDecode or encrypt? (d/e): ")
        print()
        if(choice == 'd'):
            for subdir, dirs, files in os.walk("./decrypt"):
                for file in files:
                    filepath = subdir + os.sep + file

                    if filepath.endswith(".png"):
                        print("Decoded message from [" + file + "]: " + decodeMessage(Image.open("./decrypt/" + file)))
            print("\nFinished Decoding images.")
        
        else:
            msg = input('Enter message to encode: ')

            for subdir, dirs, files in os.walk("./encrypt"):
                for file in files:
                    filepath = subdir + os.sep + file

                    if filepath.endswith(".png"):
                        try:
                            encodeMessage(Image.open("./encrypt/" + file), msg, file)
                            print("Encoded message into [" + file + "]")
                        except ValueError:
                            print("Message too long to encode in [" + file + "]")
            print("\nFinished Encoding images.")