import base64 import gradio as gr import cv2 import numpy as np import pandas as pd from PIL import Image import hashlib import os import uuid as uniq from qr import make_qr import math def to_bin(data): """Convert `data` to binary format as string""" if isinstance(data, str): return ''.join([ format(ord(i), "08b") for i in data ]) elif isinstance(data, bytes): return ''.join([ format(i, "08b") for i in data ]) elif isinstance(data, np.ndarray): return [ format(i, "08b") for i in data ] elif isinstance(data, int) or isinstance(data, np.uint8): return format(data, "08b") else: raise TypeError("Type not supported.") def decode(image_name,txt=None): BGRimage = cv2.imread(image_name) image = cv2.cvtColor(BGRimage, cv2.COLOR_BGR2RGB) #resultd = hashlib.sha256(txt.encode('utf-8')).hexdigest() binary_data = "" for row in image: for pixel in row: r, g, b = to_bin(pixel) binary_data += r[-1] binary_data += g[-1] binary_data += b[-1] all_bytes = [ binary_data[i: i+8] for i in range(0, len(binary_data), 8) ] decoded_data = "" for byte in all_bytes: decoded_data += chr(int(byte, 2)) if decoded_data[-5:] == "=====": break p = decoded_data[:-5].split("#",1)[1].split("#",1)[0] #if p == resultd: this = decoded_data[:-5].split("#",1)[0].split("'",1)[1] #base = bytes(this, 'utf-8') #with open(f"finished_im{uniqnum}.png", "wb") as fh: # fh.write(base64.decodebytes(bytes(this, 'utf-8'))) #fh.close #return f"finished_im{uniqnum}.png" return this def encode(image_name, secret_data,txt=None): BGRimage = cv2.imread(image_name) image = cv2.cvtColor(BGRimage, cv2.COLOR_BGR2RGB) n_bytes = image.shape[0] * image.shape[1] * 3 // 8 print("[*] Maximum bytes to encode:", n_bytes) #resultp = hashlib.sha256(txt.encode('utf-8')).hexdigest() secret_data1=secret_data #secret_data1=f'{secret_data}#{resultp}' while True: if len(secret_data1) < (n_bytes): secret_data1 = f'{secret_data1}#' elif len(secret_data1) >= (n_bytes): break secret_data = secret_data1 if len(secret_data) > n_bytes: return image_name, gr.Markdown.update("""

Input image is too large""") secret_data += "=====" data_index = 0 binary_secret_data = to_bin(secret_data) data_len = len(binary_secret_data) for row in image: for pixel in row: r, g, b = to_bin(pixel) if data_index < data_len: pixel[0] = int(r[:-1] + binary_secret_data[data_index], 2) data_index += 1 if data_index < data_len: pixel[1] = int(g[:-1] + binary_secret_data[data_index], 2) data_index += 1 if data_index < data_len: pixel[2] = int(b[:-1] + binary_secret_data[data_index], 2) data_index += 1 if data_index >= data_len: break return image def conv_im(qr_link,data): uniqnum = uniq.uuid4() byte_size = len(data) print (f'bytes:{byte_size}') data_pixels = byte_size*4 print (f'pixels:{data_pixels}') #data_sq=data_pixels/2 data_sq = int(math.sqrt(data_pixels)) data_pad = data_sq+100 print (f'square image:{data_pad}x{data_pad}') qr_im = make_qr(txt=qr_link) img1 = Image.open(qr_im) imgw = img1.size[0] imgh = img1.size[1] print (f'qr Size:{img1.size}') #img1.thumbnail((imgw*4,imgh*4), Image.Resampling.LANCZOS) img1 = img1.resize((int(data_pad),int(data_pad)), Image.Resampling.LANCZOS) print (img1.size) img1.save(f'tmpim{uniqnum}.png') with open(f'tmpim{uniqnum}.png', "rb") as image_file: encoded_string = base64.b64encode(image_file.read()) image_file.close() im_out = encode(f'tmpim{uniqnum}.png',data) return im_out