问题描述
我刚刚构建了一个快速生成条形码的 Python Azure 函数。响应仅是 .png 格式的渲染条码。我还需要在其下方显示条形码 VALUE。
示例:
import logging
import azure.functions as func
import code128
import io
from PIL import Image
barcode_param = '1234'
barcode_bytes = io.BytesIO()
logging.info('##### Generating barcode... #####')
barcode = code128.image(barcode_param,height=100).save(barcode_bytes,"PNG")
barcode_bytes.seek(0)
logging.info('##### Barcode successfully generated #####')
return func.HttpResponse(
barcode_bytes.getvalue(),status_code=200,mimetype='image/png'
)
barcode_bytes.close()
生成:
如何使用 code128
库将条形码值添加到条形码?
没有显示选项 in the docs。
编辑 1:在@Furas 很好的例子之后,我现在有:
import code128
import io
from PIL import Image,ImageDraw,ImageFont
# Get barcode value
barcode_param = 'SUFFERINSUCCOTASH'
# Create barcode image
barcode_image = code128.image(barcode_param,height=100)
# Create empty image for barcode + text
top_bott_margin = 70
l_r_margin = 10
new_height = barcode_image.height + (2 * top_bott_margin)
new_width = barcode_image.width + (2 * l_r_margin)
new_image = Image.new( 'RGB',(new_width,new_height),(255,255,255))
# put barcode on new image
barcode_y = 100
new_image.paste(barcode_image,(0,barcode_y))
# object to draw text
draw = ImageDraw.Draw(new_image)
# Define custom text size and font
h1_size = 28
h2_size = 28
h3_size = 16
footer_size = 21
h1_font = ImageFont.truetype("DejaVuSans-Bold.ttf",h1_size)
h2_font = ImageFont.truetype("Ubuntu-Th.ttf",h2_size)
h3_font = ImageFont.truetype("Ubuntu-Th.ttf",h3_size)
footer_font = ImageFont.truetype("UbuntuMono-R.ttf",footer_size)
# Define custom text
company_name = 'YAY! CORP.'
id1 = '11-22-33-44'
license_num = 'WHY SOYNTENLY!'
product_type = 'GRADE A GREATnesS'
center_product_type = (barcode_image.width / 2) - len(product_type) * 5
center_barcode_value = (barcode_image.width / 2) - len(barcode_param) * 8
# Draw text on picture
draw.text( (l_r_margin,0),company_name,fill=(0,font=h1_font)
draw.text( (l_r_margin,h1_size),id1,font=h2_font)
draw.text( (l_r_margin + 2,(h1_size + h2_size + 5)),license_num,font=h3_font)
draw.text( (center_product_type,(h1_size + h2_size + h3_size)),product_type,font=footer_font)
draw.text( (center_barcode_value,(new_height - footer_size - 15)),barcode_param,font=h2_font)
# save in file
new_image.save('barcode_image.png','PNG')
# show in default viewer
import webbrowser
webbrowser.open('barcode_image.png')
谢谢伙计!
解决方法
您将代码作为 Pillow 图像,因此您可以使用 Pillow 为文本添加边距并绘制此文本。
您可以获得原始尺寸
w,h = barcode_image.size
计算新尺寸
new_w = w # the same
margin = 20
new_h = h + (2*margin)
创建白色背景的空图像
new_image = Image.new('RGB',(new_w,new_h),(255,255,255))
将原始条码置于高度中间
new_image.paste(barcode_image,(0,margin))
接下来您可以使用ImageDraw
创建可以绘制对象或在图像上放置文本的对象
draw = ImageDraw.Draw(new_image)
并且您可以使用 text()
放置一些文本。您可能需要使用 ImageFont
来加载字体和设置大小。我使用默认字体和大小。
#fnt = ImageFont.truetype("arial.ttf",40)
draw.text( (10,new_h - 10),barcode_text,fill=(0,0))#,font=fnt)
并且您在 new_image
中有带有文本的图像。您可以将其保存在文件中并直接在网络浏览器中查看,也可以转换为字节发送给客户端。
在示例中,我仅使用标准模块 webbrowser
来检查图像。
编辑
正如@RufusVS 在评论中指出的,我可以使用 image_new.show()
而不是 webbrowser
import code128
import io
from PIL import Image,ImageDraw,ImageFont
barcode_param = '1234'
barcode_text = 'theseahawksarewinning'
# original image
barcode_image = code128.image(barcode_param,height=100)
# empty image for code and text - it needs margins for text
w,h = barcode_image.size
margin = 20
new_h = h +(2*margin)
new_image = Image.new( 'RGB',(w,255))
# put barcode on new image
new_image.paste(barcode_image,margin))
# object to draw text
draw = ImageDraw.Draw(new_image)
# draw text
#fnt = ImageFont.truetype("arial.ttf",font=fnt) #
# save in file
new_image.save('barcode_image.png','PNG')
# show in default viewer
import webbrowser
webbrowser.open('barcode_image.png')
# --- later send it---
barcode_bytes = io.BytesIO()
new_image.save(barcode_bytes,"PNG")
barcode_bytes.seek(0)
data = barcode_bytes.getvalue()