Advertisement
Guest User

Untitled

a guest
Dec 8th, 2018
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.97 KB | None | 0 0
  1. import glob
  2. import hashlib
  3. import os
  4. import random
  5. import time
  6. from tkinter import *
  7. from tkinter import filedialog
  8. import schedule
  9. from PIL import Image as p_image
  10. from PIL import ImageFile
  11.  
  12. ImageFile.LOAD_TRUNCATED_IMAGES = True
  13.  
  14. root = Tk()
  15. root.directory = filedialog.askdirectory()
  16.  
  17. temppwd = root.directory
  18. os.chdir(temppwd)
  19. ext_list = ['*.png', '*.gif', '*.jpeg', '*.jpg', "*.webm"]
  20. root.destroy()
  21. logf = open("failures.txt", "w")
  22.  
  23.  
  24. def pil_random():
  25.     ext_list = ['*.png', '*.jpeg', '*.jpg', '*.gif']
  26.     for extention in ext_list:
  27.         image_list = glob.glob(extention)
  28.         for image in image_list:
  29.             print(image)
  30.             fg = p_image.open(image)
  31.             randomize(fg, image, ''.join(fg.getbands()))
  32.  
  33.  
  34. def analyseImage(path):
  35.     '''
  36.    Pre-process pass over the image to determine the mode (full or additive).
  37.    Necessary as assessing single frames isn't reliable. Need to know the mode
  38.    before processing all frames.
  39.    '''
  40.     im = p_image.open(path)
  41.     results = {
  42.         'size': im.size,
  43.         'mode': 'full',
  44.     }
  45.     try:
  46.         while True:
  47.             if im.tile:
  48.                 tile = im.tile[0]
  49.                 update_region = tile[1]
  50.                 update_region_dimensions = update_region[2:]
  51.                 if update_region_dimensions != im.size:
  52.                     results['mode'] = 'partial'
  53.                     break
  54.             im.seek(im.tell() + 1)
  55.     except EOFError:
  56.         pass
  57.     return results
  58.  
  59.  
  60. def set_bit(old_byte, new_bit):
  61.     '''
  62.        Takes a byte and alters the least significant bit.
  63.        :param old_byte: The original Byte.
  64.        :param new_bit: New bit value.
  65.        '''
  66.     b = list(bin(old_byte))
  67.     b[-1] = str(new_bit)
  68.     return int(''.join(b), 2)
  69.  
  70.  
  71. def randomize(fg, image, mode):
  72.     check_change_temp_start = hashlib.md5(open(image, 'rb').read()).hexdigest()
  73.     if mode == "P":
  74.         frame_holder = []
  75.         mode_local = analyseImage(image)['mode']
  76.         nframes = 0
  77.         last_frame = fg.convert('RGBA')
  78.         p = fg.getpalette()
  79.         duration = fg.info['duration']
  80.         print(duration)
  81.         try:
  82.             while True:
  83.                 if not fg.getpalette():
  84.                     fg.putpalette(p)
  85.                 new_frame = p_image.new('RGBA', fg.size)
  86.                 for row in range(int(fg.size[1] / 16)):
  87.                     for col in range(int(fg.size[0] / 16)):
  88.                         rbga_bitswap(col, new_frame, row)
  89.                 if mode_local == 'partial':
  90.                     new_frame.paste(last_frame)
  91.                 new_frame.paste(fg, (0, 0), fg.convert('RGBA'))
  92.                 frame_holder.append(last_frame)
  93.                 nframes += 1
  94.                 last_frame = new_frame
  95.                 fg.seek(fg.tell() + 1)
  96.         except EOFError:
  97.             pass
  98.         frame_holder[0].save(image,
  99.                              save_all=True,
  100.                              append_images=frame_holder[1:],
  101.                              duration=duration,
  102.                              loop=0)
  103.         check_change_temp_final = hashlib.md5(open(image, 'rb').read()).hexdigest()
  104.         if check_change_temp_final == check_change_temp_start:
  105.             logf.write(image + "\n")
  106.     else:
  107.         for row in range(int(fg.size[1] / 16)):
  108.             for col in range(int(fg.size[0] / 16)):
  109.                 if mode == "L":
  110.                     fgL = fg.getpixel((col, row))
  111.                     rb = random.getrandbits(1)
  112.                     fgL = set_bit(fgL, rb)
  113.                     fg.putpixel((col, row), (fgL))
  114.                 elif mode in ['RGB', 'BGR']:
  115.                     fgr, fgg, fgb = fg.getpixel((col, row))
  116.  
  117.                     rb = random.getrandbits(1)  # create random bit
  118.                     fgr = set_bit(fgr, rb)  # assign random bit over least important real bit
  119.  
  120.                     gb = random.getrandbits(1)
  121.                     fgg = set_bit(fgg, gb)
  122.  
  123.                     bb = random.getrandbits(1)
  124.                     fgb = set_bit(fgb, bb)
  125.  
  126.                     fg.putpixel((col, row), (fgr, fgg, fgb))  # add pixel with modified values to new image
  127.                 elif mode == 'RGBA':
  128.                     rbga_bitswap(col, fg, row)
  129.                 else:
  130.                     continue
  131.  
  132.         fg.save(image)
  133.         check_change_temp_final = hashlib.md5(open(image, 'rb').read()).hexdigest()
  134.         if check_change_temp_final == check_change_temp_start:
  135.             logf.write(image + "\n")
  136.  
  137.  
  138. def rbga_bitswap(col, fg, row):
  139.     fgr, fgg, fgb, fga = fg.getpixel((col, row))
  140.     rb = random.getrandbits(1)  # create random bit
  141.     fgr = set_bit(fgr, rb)  # assign random bit over least important real bit
  142.     gb = random.getrandbits(1)
  143.     fgg = set_bit(fgg, gb)
  144.     bb = random.getrandbits(1)
  145.     fgb = set_bit(fgb, bb)
  146.     fg.putpixel((col, row), (fgr, fgg, fgb, fga))
  147.  
  148.  
  149. schedule.every().hour.do(pil_random)
  150. while True:
  151.     schedule.run_pending()
  152.     time.sleep(60)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement