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)