Hide image edges; improved QR template

This commit is contained in:
kdmukai
2021-07-12 20:16:15 -05:00
parent c7a89946f1
commit 2ef55a5219
7 changed files with 269 additions and 24 deletions
+60 -7
View File
@@ -1,6 +1,13 @@
import math
def generate_qr_template(qr_size, block_size=5, show_timing_marks=False):
if qr_size == 29:
num_words = 24
word_cols = 2
else:
num_words = 12
word_cols = 1
html = """
<html>
<link rel="preconnect" href="https://fonts.googleapis.com">
@@ -9,6 +16,7 @@ def generate_qr_template(qr_size, block_size=5, show_timing_marks=False):
<style>
body {
margin-top: 5em;
text-align: center;
font-family: "Open Sans", sans-serif;
-webkit-print-color-adjust: exact;
@@ -29,6 +37,11 @@ def generate_qr_template(qr_size, block_size=5, show_timing_marks=False):
width: 11px;
height: 12px;
}
.qr_table {
margin-top: 5em;
margin-right: 4em;
float: right;
}
.filled {
background-color: black;
border: 1px solid black;
@@ -55,19 +68,59 @@ def generate_qr_template(qr_size, block_size=5, show_timing_marks=False):
.no_border {
border: none;
}
.word_list_table {
"""
if num_words == 12:
html += "margin-left: 10em;\n"
else:
html += "margin-left: 0;\n"
html += """
float: left;
}
.word_list {
text-align: right;
padding-top: 2em;
padding-left: 1em;
padding-right: 1em;
}
.word_row {
height: 2.5em;
}
.word_num {
width: 1em;
text-align: right;
color: #999;
}
.word_blank {
color: #ccc;
}
</style>
<body>
"""
if qr_size == 21:
html += f"""<div class="title">{qr_size}x{qr_size} QR Code</div>"""
elif qr_size == 25:
html += f"""<div class="title">12-word Seed</div>"""
else:
html += f"""<div class="title">24-word Seed</div>"""
html += """
<table align="center" class="word_list_table">
<tr>
<td class="word_list">
"""
for i in range(1, num_words + 1):
if i == 13:
html += """
</td>
<td class="word_list">
"""
html += f"""<div class="word_row">
<span class="word_num">{i}:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
"""
html += "</td></tr></table>"
y_names = "A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,X,Y,Z"
html += """<table align="center">"""
html += """<table align="center" class="qr_table">"""
html += f"""<tr rowspan="{block_size}"><td class="col_block_divider row_block_divider"></td>"""
for j in range(0, math.ceil(qr_size/block_size)):
html += f"""<td colspan="{block_size}" class="col_name col_block_divider">{j + 1}</td>"""
+70 -1
View File
@@ -6,6 +6,7 @@
<style>
body {
margin-top: 5em;
text-align: center;
font-family: "Open Sans", sans-serif;
-webkit-print-color-adjust: exact;
@@ -26,6 +27,11 @@
width: 11px;
height: 12px;
}
.qr_table {
margin-top: 5em;
margin-right: 4em;
float: right;
}
.filled {
background-color: black;
border: 1px solid black;
@@ -52,9 +58,72 @@
.no_border {
border: none;
}
.word_list_table {
margin-left: 10em;
float: left;
}
.word_list {
text-align: right;
padding-top: 2em;
padding-left: 1em;
padding-right: 1em;
}
.word_row {
height: 2.5em;
}
.word_num {
width: 1em;
text-align: right;
color: #999;
}
.word_blank {
color: #ccc;
}
</style>
<body>
<div class="title">12-word Seed</div><table align="center"><tr rowspan="5"><td class="col_block_divider row_block_divider"></td><td colspan="5" class="col_name col_block_divider">1</td><td colspan="5" class="col_name col_block_divider">2</td><td colspan="5" class="col_name col_block_divider">3</td><td colspan="5" class="col_name col_block_divider">4</td><td colspan="5" class="col_name col_block_divider">5</td></tr><tr>
<table align="center" class="word_list_table">
<tr>
<td class="word_list">
<div class="word_row">
<span class="word_num">1:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">2:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">3:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">4:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">5:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">6:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">7:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">8:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">9:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">10:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">11:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">12:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
</td></tr></table><table align="center" class="qr_table"><tr rowspan="5"><td class="col_block_divider row_block_divider"></td><td colspan="5" class="col_name col_block_divider">1</td><td colspan="5" class="col_name col_block_divider">2</td><td colspan="5" class="col_name col_block_divider">3</td><td colspan="5" class="col_name col_block_divider">4</td><td colspan="5" class="col_name col_block_divider">5</td></tr><tr>
<td rowspan="5" class="row_name row_block_divider">A</td><td id="0_0"></td><td id="0_1"></td><td id="0_2"></td><td id="0_3"></td><td id="0_4"></td><td id="0_5"></td><td id="0_6"></td><td id="0_7"></td><td id="0_8"></td><td id="0_9"></td><td id="0_10"></td><td id="0_11"></td><td id="0_12"></td><td id="0_13"></td><td id="0_14"></td><td id="0_15"></td><td id="0_16"></td><td id="0_17"></td><td id="0_18"></td><td id="0_19"></td><td id="0_20"></td><td id="0_21"></td><td id="0_22"></td><td id="0_23"></td><td id="0_24"></td></tr>
<tr>
<td id="1_0"></td><td id="1_1"></td><td id="1_2"></td><td id="1_3"></td><td id="1_4"></td><td id="1_5"></td><td id="1_6"></td><td id="1_7"></td><td id="1_8"></td><td id="1_9"></td><td id="1_10"></td><td id="1_11"></td><td id="1_12"></td><td id="1_13"></td><td id="1_14"></td><td id="1_15"></td><td id="1_16"></td><td id="1_17"></td><td id="1_18"></td><td id="1_19"></td><td id="1_20"></td><td id="1_21"></td><td id="1_22"></td><td id="1_23"></td><td id="1_24"></td></tr>
+109 -1
View File
@@ -6,6 +6,7 @@
<style>
body {
margin-top: 5em;
text-align: center;
font-family: "Open Sans", sans-serif;
-webkit-print-color-adjust: exact;
@@ -26,6 +27,11 @@
width: 11px;
height: 12px;
}
.qr_table {
margin-top: 5em;
margin-right: 4em;
float: right;
}
.filled {
background-color: black;
border: 1px solid black;
@@ -52,9 +58,111 @@
.no_border {
border: none;
}
.word_list_table {
margin-left: 0;
float: left;
}
.word_list {
text-align: right;
padding-top: 2em;
padding-left: 1em;
padding-right: 1em;
}
.word_row {
height: 2.5em;
}
.word_num {
width: 1em;
text-align: right;
color: #999;
}
.word_blank {
color: #ccc;
}
</style>
<body>
<div class="title">24-word Seed</div><table align="center"><tr rowspan="5"><td class="col_block_divider row_block_divider"></td><td colspan="5" class="col_name col_block_divider">1</td><td colspan="5" class="col_name col_block_divider">2</td><td colspan="5" class="col_name col_block_divider">3</td><td colspan="5" class="col_name col_block_divider">4</td><td colspan="5" class="col_name col_block_divider">5</td><td colspan="5" class="col_name col_block_divider">6</td></tr><tr>
<table align="center" class="word_list_table">
<tr>
<td class="word_list">
<div class="word_row">
<span class="word_num">1:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">2:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">3:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">4:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">5:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">6:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">7:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">8:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">9:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">10:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">11:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">12:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
</td>
<td class="word_list">
<div class="word_row">
<span class="word_num">13:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">14:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">15:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">16:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">17:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">18:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">19:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">20:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">21:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">22:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">23:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
<div class="word_row">
<span class="word_num">24:&nbsp;</span><span class="word_blank">____________________________</span>
</div>
</td></tr></table><table align="center" class="qr_table"><tr rowspan="5"><td class="col_block_divider row_block_divider"></td><td colspan="5" class="col_name col_block_divider">1</td><td colspan="5" class="col_name col_block_divider">2</td><td colspan="5" class="col_name col_block_divider">3</td><td colspan="5" class="col_name col_block_divider">4</td><td colspan="5" class="col_name col_block_divider">5</td><td colspan="5" class="col_name col_block_divider">6</td></tr><tr>
<td rowspan="5" class="row_name row_block_divider">A</td><td id="0_0"></td><td id="0_1"></td><td id="0_2"></td><td id="0_3"></td><td id="0_4"></td><td id="0_5"></td><td id="0_6"></td><td id="0_7"></td><td id="0_8"></td><td id="0_9"></td><td id="0_10"></td><td id="0_11"></td><td id="0_12"></td><td id="0_13"></td><td id="0_14"></td><td id="0_15"></td><td id="0_16"></td><td id="0_17"></td><td id="0_18"></td><td id="0_19"></td><td id="0_20"></td><td id="0_21"></td><td id="0_22"></td><td id="0_23"></td><td id="0_24"></td><td id="0_25"></td><td id="0_26"></td><td id="0_27"></td><td id="0_28"></td></tr>
<tr>
<td id="1_0"></td><td id="1_1"></td><td id="1_2"></td><td id="1_3"></td><td id="1_4"></td><td id="1_5"></td><td id="1_6"></td><td id="1_7"></td><td id="1_8"></td><td id="1_9"></td><td id="1_10"></td><td id="1_11"></td><td id="1_12"></td><td id="1_13"></td><td id="1_14"></td><td id="1_15"></td><td id="1_16"></td><td id="1_17"></td><td id="1_18"></td><td id="1_19"></td><td id="1_20"></td><td id="1_21"></td><td id="1_22"></td><td id="1_23"></td><td id="1_24"></td><td id="1_25"></td><td id="1_26"></td><td id="1_27"></td><td id="1_28"></td></tr>
+2 -2
View File
@@ -266,8 +266,8 @@ class Controller:
if ret_val == True:
break
else:
# no-op; can't back out of the seed phrase view
pass
# Start over
return self.show_create_seed_with_image_tool()
# Ask to save seed
if self.storage.slot_avaliable():
+2 -4
View File
@@ -62,13 +62,11 @@ class CameraProcess():
def capture_single_frame(in_queue, out_queue):
from PIL import Image
from PIL.ImageOps import autocontrast
import picamera
print("Instantiate PiCamera start")
start_time = int(time.time() * 1000)
# camera = picamera.PiCamera(resolution=(512, 384),framerate=12)
camera = picamera.PiCamera(resolution=(480, 480), framerate=8)
camera = picamera.PiCamera(resolution=(720, 480), framerate=8)
end_time = int(time.time() * 1000)
print(f"Instantiate PiCamera finish: {end_time - start_time}ms")
@@ -106,7 +104,7 @@ class CameraProcess():
# "Rewind" the stream to the beginning so we can read its content
stream.seek(0)
out_queue.put([autocontrast(Image.open(stream), cutoff=2).rotate(90)])
out_queue.put([Image.open(stream)])
except Exception as e:
traceback.print_exc()
+18 -4
View File
@@ -2,6 +2,7 @@
from embit import bip39
from embit.bip39 import mnemonic_to_bytes, mnemonic_from_bytes
from PIL import ImageDraw, Image
from PIL.ImageOps import autocontrast
import hashlib
import math
import time
@@ -1500,12 +1501,25 @@ class SeedToolsView(View):
self.words = []
return self.words
# Resize and display
# Prep a copy of the image for display. The actual image data is 720x480
# Present just a center crop to fit the screen and to keep some of the
# data hidden.
display_version = autocontrast(
self.seed_entropy_image, cutoff=2
).rotate(
90
).crop(
(120, 0, 600, 480)
).resize(
(View.canvas_width, View.canvas_height), Image.BICUBIC
)
View.DispShowImageWithText(
self.seed_entropy_image.resize((View.canvas_width, View.canvas_height), Image.BICUBIC),
text="<= reshoot | accept =>",
display_version,
text=" < reshoot | accept > ",
font=View.ROBOTOCONDENSED_REGULAR_22,
text_color=View.color
text_color=View.color,
text_background=(0,0,0,225)
)
input = self.buttons.wait_for([B.KEY_LEFT, B.KEY_RIGHT])
+8 -5
View File
@@ -128,15 +128,18 @@ class View:
def DispShowImageWithText(image, text, font=None, text_color="GREY", text_background=None):
image_copy = image.copy()
image_copy = image.copy().convert("RGBA")
draw = ImageDraw.Draw(image_copy)
text_overlay = Image.new("RGBA", (View.canvas_width, View.canvas_height), (255,255,255,0))
text_overlay_draw = ImageDraw.Draw(text_overlay)
if not font:
font = View.COURIERNEW14
tw, th = draw.textsize(text, font=font)
tw, th = text_overlay_draw.textsize(text, font=font)
if text_background:
draw.rectangle(((240 - tw) / 2 - 3, 240 - th, (240 - tw) / 2 + tw + 3, 240), fill=text_background)
draw.text(((240 - tw) / 2, 240 - th - 1), text, fill=text_color, font=font)
View.disp.ShowImage(image_copy, 0, 0)
text_overlay_draw.rectangle(((240 - tw) / 2 - 3, 240 - th, (240 - tw) / 2 + tw + 3, 240), fill=text_background)
text_overlay_draw.text(((240 - tw) / 2, 240 - th - 1), text, fill=text_color, font=font)
View.DispShowImage(image_copy, alpha_overlay=text_overlay)
def draw_modal(self, lines = [], title = "", bottom = "") -> None: