我正在构建一个在线字体预览器,其架构如下。我将预览创建功能封装在一个独立的.py文件中,并在Django视图中对其进行系统调用,以便在多核CPU系统上并行和最大限度地运行它们。
preview.py
....
def make_preview(text, fontfile, imagefile, fontsize=30):
try:
font = ImageFont.truetype(fontfile, fontsize)
text_width, text_height = font.getsize(text)
img = Image.new('RGBA', (text_width, text_height))
draw = ImageDraw.Draw(img)
draw.text((0, 0), text, font=font, fill=(0, 0, 0))
return True
except:
return False
if __name__=='__main__':
make_preview(sys.argv[1], sys.argv[2], sys.argv[3], sys.argv[4])views.py
...
def ajax_preview(resquest):
ttf_file_list = [construct a list of .ttf files]
image_list = []
for ttf_file in ttf_file_list:
image_file = ttf_file.replace('.ttf', '.png')
image_list.append(image_file)
subprocess.Popen(['python', 'preview.py', text, ttf_file, image_file, 30)
return HttpResponse(image_list)是否有可能使上面的代码更快?也许有一个更好的架构来完成这项工作,或者我可以对代码进行任何优化?
发布于 2009-12-29 03:09:30
您应该查看多处理模块。您可以创建一个等于您的CPU核心数量的工作池,然后将作业发送到您的make_preview函数。
发布于 2009-12-29 05:05:42
如果这是一个字体选择器,您可以在每次显示时合理地显示相同的文本,您可以预渲染字体示例,并将结果保存为.PNG或.GIF文件。(您不想使用JPEG图像,因为它们会使字体变得模糊;JPEG使用有损压缩。)
然后,您可以使您的字体选择器的预渲染HTML块,引用预渲染预览图像。
您只需要在安装或从系统中删除字体时重新生成预览。
https://stackoverflow.com/questions/1972699
复制相似问题