【发布时间】:2021-01-25 08:20:59
【问题描述】:
我正在尝试从生成的图像生成 PDF 文件。生成的 PDF 文件在放大时具有高度像素化,在打印过程中会产生阴影。
PDF中放大的二维码图片
在 qrcode 模块和像素(灰色)周围显示灰色区域,否则应为白色。如果 desired_resolution 匹配或低于创建原始图像的分辨率,则无关紧要。
可能是什么问题以及可能的解决方法?
qr_size_mm = 8
MM2PX_FACTOR = 94.48 # 2400 dpi
def create_code(prefix, number, postfix=None):
message = prefix + str(number)
message += postfix if postfix is not None else ""
series_qrcode = pyqrcode.create(message, error='H', version=3, mode='binary')
# print(series_qrcode.get_png_size())
binary = BytesIO()
desired_scale = int(qr_size_px / series_qrcode.get_png_size())
series_qrcode.png(binary, scale=desired_scale, module_color=(0, 0, 0),
background=(255, 255, 255), quiet_zone=3)
tmpIm = Image.open(binary).convert('RGB')
qr_dim = tmpIm.getbbox()
# print(qr_dim)
return tmpIm, qr_dim
qr_size_px = int(qr_size_mm * MM2PX_FACTOR)
# create A4 canvas
paper_width_mm = 210
paper_height_mm = 297
start_offset_mm = 10
start_offset_px = start_offset_mm * MM2PX_FACTOR
canvas_width_px = int(paper_width_mm * MM2PX_FACTOR)
canvas_height_px = int(paper_height_mm * MM2PX_FACTOR)
pil_paper_canvas = Image.new('RGB', (canvas_width_px, canvas_height_px), (255, 255, 255))
# desired pixels for 1200 dpi print
required_resolution_px = 94.48 # 47.244 # 23.622
required_resolution = 2400
print("Page dimension {page_width} {page_height} offset {offset}".format(page_width=canvas_width_px, page_height=canvas_height_px, offset=start_offset_px))
start_range = 10000100000000
for n in range(0, 5):
print("Generating ", start_range+n)
qr_image, qr_box = create_code("TLTR", number=start_range+n)
# qr_image.show()
print("qr_box ", qr_box)
qr_x = int(start_offset_px + ((n+1) * qr_box[2]))
qr_y = int(start_offset_px)
print("pasting at ", qr_x, qr_y)
pil_paper_canvas.paste(qr_image, (qr_x, qr_y))
# create a canvas just for current qrcode
one_qr_canvas = Image.new('RGB', (int(10*MM2PX_FACTOR), int(10*MM2PX_FACTOR)), (255, 255, 255))
qrXY = int((10*MM2PX_FACTOR - qr_box[2]) / 2)
one_qr_canvas.paste(qr_image, (qrXY, qrXY))
one_qr_canvas = one_qr_canvas.resize((int(qr_size_mm*required_resolution_px),
int(qr_size_mm*required_resolution_px)))
one_qr_canvas.save(form_full_path("TLTR"+str(start_range+n)+".pdf"), dpi=(required_resolution, required_resolution))
pil_paper_canvas = pil_paper_canvas.resize((int(paper_width_mm*required_resolution_px),
int(paper_height_mm*required_resolution_px)))
# pil_paper_canvas.show()
pil_paper_canvas.save(form_full_path("TLTR_qr_A4.pdf"), dpi=(required_resolution, required_resolution))
【问题讨论】:
-
希望对此发表任何评论或寻找方向。谢谢。
-
对我来说看起来像是抗锯齿,是 PDF 格式固有的,但我不是这方面的专家。 en.wikipedia.org/wiki/Spatial_anti-aliasing
-
感谢您的 cmets @physicalattraction。尝试将大小从固定大小更改为比例/因子,但没有帮助。然后意识到 PDF 固有地以 96dpi 保存,这让我的打印变得混乱。也会尝试抗锯齿。
-
您的
resize()命令是否可以选择使用“NEAREST NEIGHBOUR” 采样而不是双线性或双三次采样? -
@MarkSetchell 是的,它 (PIL) 确实如此,目前正在使用 BILINEAR。对于从二进制到 PIL 的 qrcode,我正在放大图像,在保存的后期阶段,我可能会根据 MM2PX_FACTOR 保留比例或缩小。我意识到最大的问题是保存 PDF,这会显着降低使用 PIL 的图像分辨率 (DPI)。我还没有在 PIL 中找到一种方法来保存可打印的 PDF。
标签: python opencv image-processing python-imaging-library qr-code