mirror of
https://github.com/SeedSigner/seedsigner.git
synced 2026-10-05 23:18:25 +00:00
Hide image edges; improved QR template
This commit is contained in:
@@ -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}: </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>"""
|
||||
|
||||
@@ -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: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">2: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">3: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">4: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">5: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">6: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">7: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">8: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">9: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">10: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">11: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">12: </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>
|
||||
|
||||
@@ -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: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">2: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">3: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">4: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">5: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">6: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">7: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">8: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">9: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">10: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">11: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">12: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
|
||||
</td>
|
||||
<td class="word_list">
|
||||
<div class="word_row">
|
||||
<span class="word_num">13: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">14: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">15: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">16: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">17: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">18: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">19: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">20: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">21: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">22: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">23: </span><span class="word_blank">____________________________</span>
|
||||
</div>
|
||||
<div class="word_row">
|
||||
<span class="word_num">24: </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>
|
||||
|
||||
@@ -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():
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user