def encode(img, message):
    # proses merubah pesan string menjadi bit
    bitMessage = bo.word2bit(message)

    # mendapatkan panjang pesan setelah dirubah menjadi bit
    bitLenght = len(bitMessage)
    index = 0

    # proses mendapatkan jumlah baris dan kolom
    rows, cols = img.shape[:2]

    # inisialisasi image baru tempat pesan akan disimpan
    imgResult = np.zeros((rows, cols, 3), np.uint8) * 255
    lastIteration = True

    # proses menyisipkan pesan ke dalam gambar denganaturan lsb
    # karena citra berwarna, setiap pixel dapat menampung 3 bit pesan. Setiap bit disimpan dalam chanel R, G, dan B
    for i in range(rows):
        for j in range(cols):
            color = img[i, j]
            if lastIteration:
                for pix in range(3):
                    if index < bitLenght:
                        lsbPixel = bo.int2bit(color[pix])[-1]
                        newPixVal = color[pix] + lsbVal(
                            bitMessage[index], lsbPixel)
                        if newPixVal < 0:
                            newPixVal = 1
                        if newPixVal > 255:
                            newPixVal = 254
                        imgResult[i, j][pix] = newPixVal
                        index += 1
                    else:
                        lastIteration = False
            else:
                imgResult[i, j] = color

    # kombinasi nilai val1, val2, val3 akan menyimpan nilai infromasi panjang pesan.
    # Nilai ini dibutuhkan ketika proses decode
    val1, val2, val3, val4 = cl.setCharLength(len(message))

    # ketiga nilai tersebut akan disimpan pada pixel terakhir
    imgResult[rows - 1, cols - 1] = [val1, val2, val3]
    imgResult[rows - 1, cols - 2][0] = val4

    return imgResult
def decode(img):
    # proses mendapatkan resolusi gambar
    rows, cols = img.shape[:2]

    # proses mendapatkan nilai panjang pesan. Sehingga proses extraksi akan berhenti ketika semua pesan sudah diextract
    charLength = cl.getCharLenth(img[rows - 1, cols - 1][0], img[rows - 1,
                                                                 cols - 1][1],
                                 img[rows - 1, cols - 1][2], img[rows - 1,
                                                                 cols - 2][0])

    # panjang karakter dikalikan dengan 8 karena 1 karakter = 8 bit integer
    charLength = charLength * 8
    index = 0
    bit = []
    lastIteration = True

    # proses extraksi pesan dengan cara menelusuri setiap pixel pada gambar
    # proses menelusuri akan berhenti ketika semua pesan sudah diextract
    for i in range(rows):
        j = 0
        while j < cols:
            if lastIteration:
                for pix in range(3):
                    if index < charLength:
                        gi, gi1 = int(img[i, j][pix]), int(img[i, j + 1][pix])
                        diff = abs(gi - gi1)
                        ik, n = qTable(diff)
                        b = bo.int2bit(abs(diff - ik))
                        fixBit = [0 for i in range(n - len(b))]
                        fixBit.extend(b)
                        bit.extend(fixBit)
                        index += n
                        img[i, j][pix] -= diff
                        if img[i, j][pix] < 0:
                            img[i, j][pix] = 0
                    else:
                        lastIteration = False
            else:
                break
            j += 2

    cv2.imwrite('../img/pvd-color/after-decode.png', img)
    return bo.bit2word(bit)