def run(words, version=1, level='H', scale=1): supported_chars = r"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ··,.:;+-*/\~!@#$%^&`'=<>[]()?_{}|" # check every parameter if not isinstance(words, str) or any(i not in supported_chars for i in words): raise ValueError( 'Wrong words! Make sure the characters are supported!') if not isinstance(version, int) or version not in range(1, 41): raise ValueError( 'Wrong version! Please choose a int-type value from 1 to 40!') if not isinstance(level, str) or len(level) > 1 or level not in 'LMQH': raise ValueError( "Wrong level! Please choose a str-type level from {'L','M','Q','H'}!" ) # tempdir = os.path.join(os.path.expanduser('~'), '.myqr') tempdir = tempfile.mkdtemp(prefix='myqr_') try: if not os.path.exists(tempdir): os.makedirs(tempdir) ver, qr_name = theqrmodule.get_qrcode(version, level, words, tempdir) qr = combine(ver, qr_name) if scale != 1: qr = qr.resize((qr.size[0] * scale, qr.size[1] * scale)) return qr except: raise finally: import shutil if os.path.exists(tempdir): shutil.rmtree(tempdir)
def run(words: str, version: object = 1, level: object = 'H', scale: int = 1, color: object = (0, 0, 0), image: object = None) -> object: supported_chars = r"0123456789" \ r"ABCDEFGHIJKLMNOPQRSTUVWXYZ" \ r"abcdefghijklmnopqrstuvwxyz" \ r" ··,.:;+-*/\~!@#$%^&`'=<>[]()?_{}| " # \ # r"АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ" \ # r"абвгдеёжзийклмнопрстуфхцчшщъыьэюя" \ # check every parameter if not isinstance(words, str) or any(i not in supported_chars for i in words): raise ValueError('Wrong words! Make sure the characters are supported!') if not isinstance(version, int) or version not in range(1, 41): raise ValueError('Wrong version! Please choose a int-type value from 1 to 40!') if not isinstance(level, str) or len(level) > 1 or level not in 'LMQH': raise ValueError("Wrong level! Please choose a string-type level from {'L','M','Q','H'}!") if not isinstance(scale, int) or scale not in range(1, 16): raise ValueError('Wrong scale! Please choose a string-type level from 1 to 16!') if not isinstance(color, tuple) or len(color) != 3 or len([c for c in color if c in range(0, 256)]) != len(color): raise ValueError('Wrong color! Color must be a tuple which every item is in range from 0 to 255') try: ver, qr_code = theqrmodule.get_qrcode(version, level, words, scale, color) qr = combine(ver, qr_code, scale, color, image) return qr except: raise
def run(words, version=1, level='H', picture=None, colorized=False, contrast=1.0, brightness=1.0, save_name=None, save_dir=os.getcwd()): supported_chars = r"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ··,.:;+-*/\~!@#$%^&`'=<>[]()?_{}|" # check every parameter if not isinstance(words, str) or any(i not in supported_chars for i in words): raise ValueError('Wrong words! Make sure the characters are supported!') if not isinstance(version, int) or version not in range(1, 41): raise ValueError('Wrong version! Please choose a int-type value from 1 to 40!') if not isinstance(level, str) or len(level)>1 or level not in 'LMQH': raise ValueError("Wrong level! Please choose a str-type level from {'L','M','Q','H'}!") if picture: if not isinstance(picture, str) or not os.path.isfile(picture) or picture[-4:] not in ('.jpg','.png','.bmp','.gif'): raise ValueError("Wrong picture! Input a filename that exists and be tailed with one of {'.jpg', '.png', '.bmp', '.gif'}!") if picture[-4:] == '.gif' and save_name and save_name[-4:] != '.gif': raise ValueError('Wrong save_name! If the picuter is .gif format, the output filename should be .gif format, too!') if not isinstance(colorized, bool): raise ValueError('Wrong colorized! Input a bool-type value!') if not isinstance(contrast, float): raise ValueError('Wrong contrast! Input a float-type value!') if not isinstance(brightness, float): raise ValueError('Wrong brightness! Input a float-type value!') if save_name and (not isinstance(save_name, str) or save_name[-4:] not in ('.jpg','.png','.bmp','.gif')): raise ValueError("Wrong save_name! Input a filename tailed with one of {'.jpg', '.png', '.bmp', '.gif'}!") if not os.path.isdir(save_dir): raise ValueError('Wrong save_dir! Input a existing-directory!') def combine(ver, qr_name, bg_name, colorized, contrast, brightness, save_dir, save_name=None): from mylibs.constant import alig_location from PIL import ImageEnhance, ImageFilter qr = Image.open(qr_name) qr = qr.convert('RGBA') if colorized else qr bg0 = Image.open(bg_name).convert('RGBA') bg0 = ImageEnhance.Contrast(bg0).enhance(contrast) bg0 = ImageEnhance.Brightness(bg0).enhance(brightness) if bg0.size[0] < bg0.size[1]: bg0 = bg0.resize((qr.size[0]-24, (qr.size[0]-24)*int(bg0.size[1]/bg0.size[0]))) else: bg0 = bg0.resize(((qr.size[1]-24)*int(bg0.size[0]/bg0.size[1]), qr.size[1]-24)) bg = bg0 if colorized else bg0.convert('1') aligs = [] if ver > 1: aloc = alig_location[ver-2] for a in range(len(aloc)): for b in range(len(aloc)): if not ((a==b==0) or (a==len(aloc)-1 and b==0) or (a==0 and b==len(aloc)-1)): for i in range(3*(aloc[a]-2), 3*(aloc[a]+3)): for j in range(3*(aloc[b]-2), 3*(aloc[b]+3)): aligs.append((i,j)) for i in range(qr.size[0]-24): for j in range(qr.size[1]-24): if not ((i in (18,19,20)) or (j in (18,19,20)) or (i<24 and j<24) or (i<24 and j>qr.size[1]-49) or (i>qr.size[0]-49 and j<24) or ((i,j) in aligs) or (i%3==1 and j%3==1) or (bg0.getpixel((i,j))[3]==0)): qr.putpixel((i+12,j+12), bg.getpixel((i,j))) qr_name = os.path.join(save_dir, os.path.splitext(os.path.basename(bg_name))[0] + '_qrcode.png') if not save_name else os.path.join(save_dir, save_name) qr.resize((qr.size[0]*3, qr.size[1]*3)).save(qr_name) return qr_name tempdir = os.path.join(os.path.expanduser('~'), '.myqr') try: if not os.path.exists(tempdir): os.makedirs(tempdir) ver, qr_name = theqrmodule.get_qrcode(version, level, words, tempdir) if picture and picture[-4:]=='.gif': import imageio im = Image.open(picture) duration = im.info.get('duration', 0) im.save(os.path.join(tempdir, '0.png')) while True: try: seq = im.tell() im.seek(seq + 1) im.save(os.path.join(tempdir, '%s.png' %(seq+1))) except EOFError: break imsname = [] for s in range(seq+1): bg_name = os.path.join(tempdir, '%s.png' % s) imsname.append(combine(ver, qr_name, bg_name, colorized, contrast, brightness, tempdir)) ims = [imageio.imread(pic) for pic in imsname] qr_name = os.path.join(save_dir, os.path.splitext(os.path.basename(picture))[0] + '_qrcode.gif') if not save_name else os.path.join(save_dir, save_name) imageio.mimwrite(qr_name, ims, '.gif', **{ 'duration': duration/1000 }) elif picture: qr_name = combine(ver, qr_name, picture, colorized, contrast, brightness, save_dir, save_name) elif qr_name: qr = Image.open(qr_name) qr_name = os.path.join(save_dir, os.path.basename(qr_name)) if not save_name else os.path.join(save_dir, save_name) qr.resize((qr.size[0]*3, qr.size[1]*3)).save(qr_name) return ver, level, qr_name except: raise finally: import shutil if os.path.exists(tempdir): shutil.rmtree(tempdir)
def run(words, version=1, level='H', picture=None, colorized=False, contrast=1.0, brightness=1.0, save_name=None, save_dir=os.getcwd()): supported_chars = r"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz ··,.:;+-*/\~!@#$%^&`'=<>[]()?_{}|" # check every parameter if not isinstance(words, str) or any(i not in supported_chars for i in words): raise ValueError('Wrong words! Make sure the characters are supported!') if not isinstance(version, int) or version not in range(1, 41): raise ValueError('Wrong version! Please choose a int-type value from 1 to 40!') if not isinstance(level, str) or len(level)>1 or level not in 'LMQH': raise ValueError("Wrong level! Please choose a str-type level from {'L','M','Q','H'}!") if picture: if not isinstance(picture, str) or not os.path.isfile(picture) or picture[-4:] not in ('.jpg','.png','.bmp','.gif'): raise ValueError("Wrong picture! Input a filename that exists and be tailed with one of {'.jpg', '.png', '.bmp', '.gif'}!") if picture[-4:] == '.gif' and save_name and save_name[-4:] != '.gif': raise ValueError('Wrong save_name! If the picuter is .gif format, the output filename should be .gif format, too!') if not isinstance(colorized, bool): raise ValueError('Wrong colorized! Input a bool-type value!') if not isinstance(contrast, float): raise ValueError('Wrong contrast! Input a float-type value!') if not isinstance(brightness, float): raise ValueError('Wrong brightness! Input a float-type value!') if save_name and (not isinstance(save_name, str) or save_name[-4:] not in ('.jpg','.png','.bmp','.gif')): raise ValueError("Wrong save_name! Input a filename tailed with one of {'.jpg', '.png', '.bmp', '.gif'}!") if not os.path.isdir(save_dir): raise ValueError('Wrong save_dir! Input a existing-directory!') def combine(ver, qr_name, bg_name, colorized, contrast, brightness, save_dir, save_name=None): from MyQR.mylibs.constant import alig_location from PIL import ImageEnhance, ImageFilter qr = Image.open(qr_name) qr = qr.convert('RGBA') if colorized else qr bg0 = Image.open(bg_name).convert('RGBA') bg0 = ImageEnhance.Contrast(bg0).enhance(contrast) bg0 = ImageEnhance.Brightness(bg0).enhance(brightness) if bg0.size[0] < bg0.size[1]: bg0 = bg0.resize((qr.size[0]-24, (qr.size[0]-24)*int(bg0.size[1]/bg0.size[0]))) else: bg0 = bg0.resize(((qr.size[1]-24)*int(bg0.size[0]/bg0.size[1]), qr.size[1]-24)) bg = bg0 if colorized else bg0.convert('1') aligs = [] if ver > 1: aloc = alig_location[ver-2] for a in range(len(aloc)): for b in range(len(aloc)): if not ((a==b==0) or (a==len(aloc)-1 and b==0) or (a==0 and b==len(aloc)-1)): for i in range(3*(aloc[a]-2), 3*(aloc[a]+3)): for j in range(3*(aloc[b]-2), 3*(aloc[b]+3)): aligs.append((i,j)) for i in range(qr.size[0]-24): for j in range(qr.size[1]-24): if not ((i in (18,19,20)) or (j in (18,19,20)) or (i<24 and j<24) or (i<24 and j>qr.size[1]-49) or (i>qr.size[0]-49 and j<24) or ((i,j) in aligs) or (i%3==1 and j%3==1) or (bg0.getpixel((i,j))[3]==0)): qr.putpixel((i+12,j+12), bg.getpixel((i,j))) qr_name = os.path.join(save_dir, os.path.splitext(os.path.basename(bg_name))[0] + '_qrcode.png') if not save_name else os.path.join(save_dir, save_name) qr.resize((qr.size[0]*3, qr.size[1]*3)).save(qr_name) return qr_name tempdir = os.path.join(os.path.expanduser('~'), '.myqr') try: if not os.path.exists(tempdir): os.makedirs(tempdir) ver, qr_name = theqrmodule.get_qrcode(version, level, words, tempdir) if picture and picture[-4:]=='.gif': import imageio im = Image.open(picture) duration = im.info.get('duration', 0) im.save(os.path.join(tempdir, '0.png')) while True: try: seq = im.tell() im.seek(seq + 1) im.save(os.path.join(tempdir, '%s.png' %(seq+1))) except EOFError: break imsname = [] for s in range(seq+1): bg_name = os.path.join(tempdir, '%s.png' % s) imsname.append(combine(ver, qr_name, bg_name, colorized, contrast, brightness, tempdir)) ims = [imageio.imread(pic) for pic in imsname] qr_name = os.path.join(save_dir, os.path.splitext(os.path.basename(picture))[0] + '_qrcode.gif') if not save_name else os.path.join(save_dir, save_name) imageio.mimwrite(qr_name, ims, '.gif', **{ 'duration': duration/1000 }) elif picture: qr_name = combine(ver, qr_name, picture, colorized, contrast, brightness, save_dir, save_name) elif qr_name: qr = Image.open(qr_name) qr_name = os.path.join(save_dir, os.path.basename(qr_name)) if not save_name else os.path.join(save_dir, save_name) qr.resize((qr.size[0]*3, qr.size[1]*3)).save(qr_name) return ver, level, qr_name except: raise finally: import shutil if os.path.exists(tempdir): shutil.rmtree(tempdir)
def run(): import argparse argparser = argparse.ArgumentParser() argparser.add_argument( 'WORDs', help= 'The words to produce you QR-code picture, like a URL or a sentence. Please read the README file for the supported characters.' ) argparser.add_argument( '-v', '--version', type=int, choices=range(1, 41), help= 'The version means the length of a side of the QR-Code picture. From little size to large is 1 to 40.' ) argparser.add_argument( '-l', '--level', choices=list('LMQH'), help= 'Use this argument to choose an Error-Correction-Level: L(Low), M(Medium) or Q(Quartile), H(High). Otherwise, just use the default one: H' ) argparser.add_argument('-p', '--picture', help='the picture e.g. example_pic.jpg') argparser.add_argument( '-c', '--colorized', action='store_true', help= "Produce a colorized QR-Code with your picture. Just works when there is a correct '-p' or '--picture'." ) argparser.add_argument( '-con', '--contrast', type=float, help= 'A floating point value controlling the enhancement of contrast. Factor 1.0 always returns a copy of the original image, lower factors mean less color (brightness, contrast, etc), and higher values more. There are no restrictions on this value. Default: 1.0' ) argparser.add_argument( '-bri', '--brightness', type=float, help= 'A floating point value controlling the enhancement of brightness. Factor 1.0 always returns a copy of the original image, lower factors mean less color (brightness, contrast, etc), and higher values more. There are no restrictions on this value. Default: 1.0' ) args = argparser.parse_args() tempdir = os.path.join(os.path.expanduser('~'), '.myqr') try: # the default version depends on WORDs and level # init as 0 ver = args.version if args.version else 0 # the default level is Q ecl = args.level if args.level else 'H' if not os.path.exists(tempdir): os.makedirs(tempdir) try: ver, qr_name = theqrmodule.get_qrcode(ver, ecl, args.WORDs, tempdir) except TypeError: qr_name = args.picture = None if args.picture and args.picture[-4:] == '.gif': print('it takes a while, please wait for minutes...') import imageio im = Image.open(args.picture) im.save(os.path.join(tempdir, '0.png')) while True: try: seq = im.tell() im.seek(seq + 1) im.save(os.path.join(tempdir, '%s.png' % (seq + 1))) except EOFError: break imsname = [] for s in range(seq + 1): bg_name = os.path.join(tempdir, '%s.png' % s) imsname.append( combine(ver, qr_name, bg_name, args.colorized, args.contrast, args.brightness, tempdir)) ims = [imageio.imread(pic) for pic in imsname] qr_name = os.path.splitext(os.path.basename( args.picture))[0] + '_qrcode.gif' imageio.mimsave(qr_name, ims) elif args.picture: qr_name = combine(ver, qr_name, args.picture, args.colorized, args.contrast, args.brightness, os.getcwd()) elif qr_name: qr = Image.open(qr_name) qr_name = os.path.basename(qr_name) qr.resize((qr.size[0] * 3, qr.size[1] * 3)).save(qr_name) if qr_name: print( 'Succeed! \nCheck out your ' + str(ver) + '-' + str(ecl) + ' QR-code at', os.path.abspath(qr_name)) except: raise finally: import shutil if os.path.exists(tempdir): shutil.rmtree(tempdir)