def make(self): if self.needs_update == True: self.qr = QRCode(self.size, self.level) self.qr.addData(self.data) # Check that the data fits into the QR code of the required size: size = self.qr.getMinimumSize() if self.size < size: self.size = size self.qr = QRCode(size, self.level) self.qr.addData(self.data) self.qr.make() self.image = self.qr.makeImage() self.needs_update = False
class QR(): ''' Base QR Code API class.''' def __init__(self, size=1, level = QRErrorCorrectLevel.M): self.qr = QRCode(size, level) self.data = '' self.level = level self.size = size self.needs_update = True def write(self, text): self.data += text.__str__() self.needs_update = True def make(self): if self.needs_update == True: self.qr = QRCode(self.size, self.level) self.qr.addData(self.data) # Check that the data fits into the QR code of the required size: size = self.qr.getMinimumSize() if self.size < size: self.size = size self.qr = QRCode(size, self.level) self.qr.addData(self.data) self.qr.make() self.image = self.qr.makeImage() self.needs_update = False def display(self): if self.needs_update: self.make() self.image.show() def save(self, imagename): self.image.save(imagename)
class QR(): ''' Base QR Code API class.''' def __init__(self, size=1, level=QRErrorCorrectLevel.M): self.qr = QRCode(size, level) self.data = '' self.level = level self.size = size self.needs_update = True def write(self, text): self.data += text.__str__() self.needs_update = True def make(self): if self.needs_update == True: self.qr = QRCode(self.size, self.level) self.qr.addData(self.data) # Check that the data fits into the QR code of the required size: size = self.qr.getMinimumSize() if self.size < size: self.size = size self.qr = QRCode(size, self.level) self.qr.addData(self.data) self.qr.make() self.image = self.qr.makeImage() self.needs_update = False def display(self): if self.needs_update: self.make() self.image.show() def save(self, imagename): self.image.save(imagename)
def make_image(self): qr = QRCode(9, QRErrorCorrectLevel.L) # 8 handles long data also qr.addData(self.data) qr.make() # todo: handle typeerror when data is too large im = qr.makeImage() im.save(self.img_path, "JPEG")
def text_to_qrSvg(text, left = 0, top = 0, width = 100): qr = QRCode(qr_version_for_h(text), QRErrorCorrectLevel.H) qr.addData(text) qr.make() size = float(width) / qr.getModuleCount() antigapFactor = 1.05 arr = [] for y in range(qr.getModuleCount()): for x in range(qr.getModuleCount()): if qr.isDark(y, x): arr.append( '<rect x="' + f2s(left + x * size) + '" y="' + f2s(top + y * size) + '" width="' + f2s(size * antigapFactor) + '" height="' + f2s(size * antigapFactor) + '" fill="#000000" />\n') return ''.join(arr)
def qr_data_uri(self): """Generates a QR Code and returns it as a data URI""" qr = QRCode(4, QRErrorCorrectLevel.L) qr.addData(self.hmac()) qr.make() im = qr.makeImage() # the image in the data uri seems to be rotated, unintentionally. im = im.rotate(180) qr_string = StringIO.StringIO() im.save(qr_string, format="PNG") format = "data:image/png;base64,{0}" return format.format(base64.b64encode(qr_string.getvalue()))
def save_qrcode(text, img_type, path, name, qr_type_number, error_correct_level): # write qr code to filesystem if img_type not in QR_IMG_TYPES: raise ImageTypeException("can't generate QR Code, not a valid type") if not toolbox.string_has_content(text): raise ValueError("can't generate QR Code without proper string content") qr = QRCode(qr_type_number, error_correct_level) qr.addData(text) qr.make() im = qr.makeImage() qrcode_filename = name+img_type im.save(QR_FS_ROOT+qrcode_filename) return qrcode_filename
def user_create_barcode(sender, instance, created, **kwargs): instance = User.objects.get(email=instance.email) password_hash = gen_passhash(instance) qr = QRCode(8, QRErrorCorrectLevel.Q) qr.addData("####%s|%s" % (str(instance.pk), str(password_hash))) qr.make() im = qr.makeImage() temp_file = StringIO() # We'll take the username if we have to, but prefer first+last im.save(temp_file, format='png') barcode_contents = ContentFile(temp_file.getvalue()) user_barcode = UserBarcode.objects.get_or_create(user=instance)[0] user_barcode.barcode.save('%s.png' % str(instance.pk), barcode_contents) if settings.PRINT_CARDS: print_card(instance, user_barcode.barcode.name) pass
def render_label(request, c, metrics, da, badge_img, debug): """Render a single label""" badge = da.badge badge_image_width = (1.0 + (1.0 / 64.0)) * inch badge_image_height = (1.0 + (1.0 / 64.0)) * inch qr_left = badge_image_width - metrics["qr_overlap"] qr_bottom = badge_image_height - metrics["qr_overlap"] qr_width = metrics["width"] - qr_left qr_height = metrics["height"] - qr_bottom if False and debug: # Draw some layout lines on debug. c.setLineWidth(0.3) c.rect(0, 0, metrics["width"], metrics["height"]) c.rect(qr_left, qr_bottom, qr_width, qr_height) c.rect(0, 0, badge_image_width, badge_image_height) fit_text(c, da.badge.title, 0.0, badge_image_height, badge_image_width, qr_height) c.saveState() c.rotate(-90) code_height = qr_height * (0.45) claim_height = qr_height - code_height c.setFont("Courier", code_height) c.drawCentredString(0 - (badge_image_width / 2.0), metrics["height"] - code_height, da.claim_code) text = """ <font name="Helvetica">Claim at</font> <font name="Courier">%s</font> """ % ( settings.SITE_TITLE ) fit_text(c, text, 0 - badge_image_height, badge_image_width, badge_image_width, claim_height) c.restoreState() # Attempt to build a QR code image for the claim URL claim_url = request.build_absolute_uri(da.get_claim_url()) qr_img = None try: # Try using PyQRNative: http://code.google.com/p/pyqrnative/ # badg.us should have this in vendor-local from PyQRNative import QRCode, QRErrorCorrectLevel # TODO: Good-enough settings? if len(claim_url) < 20: qr = QRCode(3, QRErrorCorrectLevel.L) elif len(claim_url) < 50: qr = QRCode(4, QRErrorCorrectLevel.L) else: qr = QRCode(10, QRErrorCorrectLevel.L) qr.addData(claim_url) qr.make() qr_img = ImageReader(qr.makeImage()) except ImportError: try: # Hmm, if we don't have PyQRNative, then try abusing this web # service. Should be fine for low volumes. qr_url = "http://api.qrserver.com/v1/create-qr-code/?%s" % urllib.urlencode( {"size": "%sx%s" % (500, 500), "data": claim_url} ) qr_img = ImageReader(StringIO(urllib2.urlopen(qr_url).read())) except Exception: # Ignore issues in drawing the QR code - maybe show an error? pass if qr_img: c.drawImage(qr_img, qr_left, qr_bottom, qr_width, qr_height) c.drawImage(badge_img, 0.0 * inch, 0.0 * inch, badge_image_width, badge_image_height)
print 'Usage: python', sys.argv[0], 'content' sys.exit(1) levels = [17, 32, 53, 78, 106, 134, 154, 192, 230, 271] level = None for i in zip(range(1, 11), levels): if len(text) <= i[1]: level = i[0] break if level is None: print 'Content too long (271 characters maximum).' sys.exit(1) qr = QRCode(level, QRErrorCorrectLevel.L) qr.addData(text) qr.make() dark = ' ' light = u'\u2588\u2588' width = qr.moduleCount for i in range(4): print light * (qr.moduleCount + 8) for y in range(qr.moduleCount): row = light * 4 for x in range(qr.moduleCount):
def ticket(image, ticket, utils): image = image.copy() if not ticket: return image import string _multi = ( 'pier maria', 'gian battista', 'arnaldo miguel', 'dr. yves', 'dr. stefan', 'mr yun', ) check = ticket['name'].lower() for x in _multi: if check.startswith(x): first_name = ticket['name'][:len(x)].strip() last_name = ticket['name'][len(x):].strip() break else: try: first_name, last_name = ticket['name'].split(' ', 1) except ValueError: first_name = ticket['name'] last_name = '' tagline = ticket.get('tagline', '').strip() first_name = first_name.upper().strip() last_name = string.capwords(last_name.strip()) color_name = 75, 129, 135 color_info = 125, 111, 96 w = image.size[0] / 2 name_width = max( _FONTS['name'].getsize(first_name)[0], _FONTS['name'].getsize(last_name)[0]) if name_width > w - 60: font = _FONTS['name_small'] name_y = 400, 510 else: font = _FONTS['name'] name_y = 460, 590 if ticket['badge_image']: logo = Image.open(ticket['badge_image']).resize((64, 64)) if logo.mode != 'RGBA': if logo.mode == 'LA': logo = logo.convert('RGBA') else: if logo.mode != 'RGB': logo = logo.convert('RGB') logo = makeColorTransparent(logo, logo.getpixel((0, 0)), thresh2=150) else: logo = PY_LOGO rows = [ (first_name, (50, name_y[0]), font, color_name), (last_name, (50, name_y[1]), font, color_name), (tagline, (50, 880), _FONTS['info'], color_info), ] + [ (logo, (50 + (logo.size[0] + 20) * ix, 700)) for ix in range(ticket.get('experience', 0)) ] mirrored = [ (row[0], ) + ((w + row[1][0], row[1][1]),) + row[2:] for row in rows ] for row in rows + mirrored: if isinstance(row[0], Image.Image): image.paste(row[0], row[1], row[0]) else: t, pos, font, color = row utils['draw_info'](image, w - 60, t, pos, font, color) if ticket.get('profile-link'): qr = QRCode(8, QRErrorCorrectLevel.H) qr.addData(ticket['profile-link']) qr.make() im = qr.makeImage().resize((int(18*0.03937*300), int(18*0.03937*300))) image.paste(im, (w + 600, 1030)) return image
def render_label(request, c, metrics, da, badge_img, debug): """Render a single label""" badge = da.badge badge_image_width = (1.0 + (1.0/64.0)) * inch badge_image_height = (1.0 + (1.0/64.0)) * inch qr_left = badge_image_width - metrics['qr_overlap'] qr_bottom = badge_image_height - metrics['qr_overlap'] qr_width = metrics['width'] - qr_left qr_height = metrics['height'] - qr_bottom if False and debug: # Draw some layout lines on debug. c.setLineWidth(0.3) c.rect(0, 0, metrics['width'], metrics['height']) c.rect(qr_left, qr_bottom, qr_width, qr_height) c.rect(0, 0, badge_image_width, badge_image_height) fit_text(c, da.badge.title, 0.0, badge_image_height, badge_image_width, qr_height) c.saveState() c.rotate(-90) code_height = qr_height * (0.45) claim_height = qr_height - code_height c.setFont("Courier", code_height) c.drawCentredString(0 - (badge_image_width / 2.0), metrics['height'] - code_height, da.claim_code) text = """ <font name="Helvetica">Claim at</font> <font name="Courier">%s</font> """ % (settings.SITE_TITLE) fit_text(c, text, 0 - badge_image_height, badge_image_width, badge_image_width, claim_height) c.restoreState() # Attempt to build a QR code image for the claim URL claim_url = request.build_absolute_uri(da.get_claim_url()) qr_img = None try: # Try using PyQRNative: http://code.google.com/p/pyqrnative/ # badg.us should have this in vendor-local from PyQRNative import QRCode, QRErrorCorrectLevel # TODO: Good-enough settings? if len(claim_url) < 20: qr = QRCode(3, QRErrorCorrectLevel.L) elif len(claim_url) < 50: qr = QRCode(4, QRErrorCorrectLevel.L) else: qr = QRCode(10, QRErrorCorrectLevel.L) qr.addData(claim_url) qr.make() qr_img = ImageReader(qr.makeImage()) except ImportError: try: # Hmm, if we don't have PyQRNative, then try abusing this web # service. Should be fine for low volumes. qr_url = ("http://api.qrserver.com/v1/create-qr-code/?%s" % urllib.urlencode({'size':'%sx%s' % (500, 500), 'data':claim_url})) qr_img = ImageReader(StringIO(urllib2.urlopen(qr_url).read())) except Exception, e: # Ignore issues in drawing the QR code - maybe show an error? pass
def __init__(self, size=1, level = QRErrorCorrectLevel.M): self.qr = QRCode(size, level) self.data = '' self.level = level self.size = size self.needs_update = True
def __init__(self, size=1, level=QRErrorCorrectLevel.M): self.qr = QRCode(size, level) self.data = '' self.level = level self.size = size self.needs_update = True
def ticket(image, ticket, utils): image = image.copy() if not ticket: return image import string _multi = ( 'pier maria', 'gian battista', 'arnaldo miguel', 'dr. yves', 'dr. stefan', 'mr yun', ) check = ticket['name'].lower() for x in _multi: if check.startswith(x): first_name = ticket['name'][:len(x)].strip() last_name = ticket['name'][len(x):].strip() break else: try: first_name, last_name = ticket['name'].split(' ', 1) except ValueError: first_name = ticket['name'] last_name = '' tagline = ticket.get('tagline', '').strip() first_name = first_name.upper().strip() last_name = string.capwords(last_name.strip()) color_name = 75, 129, 135 color_info = 125, 111, 96 w = image.size[0] / 2 name_width = max(_FONTS['name'].getsize(first_name)[0], _FONTS['name'].getsize(last_name)[0]) if name_width > w - 60: font = _FONTS['name_small'] name_y = 400, 510 else: font = _FONTS['name'] name_y = 460, 590 if ticket['badge_image']: logo = Image.open(ticket['badge_image']).resize((64, 64)) if logo.mode != 'RGBA': if logo.mode == 'LA': logo = logo.convert('RGBA') else: if logo.mode != 'RGB': logo = logo.convert('RGB') logo = makeColorTransparent(logo, logo.getpixel((0, 0)), thresh2=150) else: logo = PY_LOGO rows = [ (first_name, (50, name_y[0]), font, color_name), (last_name, (50, name_y[1]), font, color_name), (tagline, (50, 880), _FONTS['info'], color_info), ] + [(logo, (50 + (logo.size[0] + 20) * ix, 700)) for ix in range(ticket.get('experience', 0))] mirrored = [(row[0], ) + ((w + row[1][0], row[1][1]), ) + row[2:] for row in rows] for row in rows + mirrored: if isinstance(row[0], Image.Image): image.paste(row[0], row[1], row[0]) else: t, pos, font, color = row utils['draw_info'](image, w - 60, t, pos, font, color) if ticket.get('profile-link'): qr = QRCode(8, QRErrorCorrectLevel.H) qr.addData(ticket['profile-link']) qr.make() im = qr.makeImage().resize( (int(18 * 0.03937 * 300), int(18 * 0.03937 * 300))) image.paste(im, (w + 600, 1030)) return image