Проблема в написании немецкого текста на изображении с использованием Python и PIL - PullRequest
0 голосов
/ 25 июня 2019

Я хочу прочитать текстовый файл и извлечь из него текст на немецком языке и записать его на изображение png, используя PIL и python 2.7, но при записи в изображение с помощью .text () я получаю неизвестный текст всякий раз, когда Ü или какой-либо иностранныйперсонаж приходит.Я использовал arialunicodems.ttf для шрифта.

Во-первых, я извлекал текст из изображения, используя Microsoft Azure Cognitive Vision и используя .encode ('utf-8') для каждого слова и комбинируя слова, чтобы составить предложение вАнглийский, а затем преобразование в немецкий с использованием библиотеки Python mtranslate.Затем я использовал arialunicodems.ttf в качестве шрифта и использовал функцию .text () PIL Image для рисования текста в png.Он рисовал правильно для немецкого, китайского, хинди и т. Д. Но затем я хотел добавить функциональность, чтобы пользователь мог изменять переведенный текст, если он был переведен неправильно.Для этого я сохранил исходный текст и переведенный текст в TXT-файле и отобразил содержимое TXT-файла пользователю, где пользователь изменяет его, если необходимо, и измененный текст снова сохраняется в TXT-файле.Затем с помощью другой программы на Python я добавил текст к изображению.Но на этот раз текст становится бессмысленным всякий раз, когда его «, он рисует» на изображении.Для хинди это все бред.В чем может быть проблема?

Рабочий код: часть, где я объединял слова для составления предложения (сохраненный в переменном тексте).

for word in word_infos:
                bbox = [int(num) for num in word["boundingBox"].split(",")]
                if bbox[0]>=x and bbox[1]>=y and bbox[0]+bbox[2]<=x+w and bbox[1]+bbox[3]<=y+h:
                    text = text+word["text"].encode('utf-8')+" "

часть, где я записывал текст в изображение

im = Image.open("check.png")
d = ImageDraw.Draw(im)
helvetica = ImageFont.truetype("arialunicodems.ttf",10)
d.text((x,y), mtranslate.translate(text, sys.argv[3], sys.argv[2]), font=helvetica, fill=(0,0,0))

Неработающий код: часть, в которой я сохранял извлеченный текст в текстовый файл

for word in word_infos:
                bbox = [int(num) for num in word["boundingBox"].split(",")]
                if bbox[0]>=x and bbox[1]>=y and bbox[0]+bbox[2]<=x+w and bbox[1]+bbox[3]<=y+h:
                    text = text+word["text"].encode('utf-8')+" "
file.write("orignaltext:"+text+"\n")

часть, где я извлекал текст из файла txt и записывал изображение

im = Image.open("check.png")
d = ImageDraw.Draw(im)
file2 = open("1.txt","r")
printframe = file2.readlines()
#j and traceorig is defined to extract text in loop
orig = printframe[j*6+3][traceorig:len(printframe[j*6+3])-1].encode('utf-8')
#xstr,ystr,r,g,b are extracted from image
d.text((int(xstr),int(ystr)), mtranslate.translate(orig,"de","en").encode('utf-8'), font=helvetica, fill=(int(r), int(g), int(b)))

Для «Обзор» на английском я хочу
На немецком языке: Überblick
На хинди: अवलोकन
В обновленном коде, когда я печатаю на терминале, он печатает правильно, но на изображении, которое он пишет
На немецком языке: ☐☐berblick
На хинди: Не удается найти символы, см. Ссылку на изображение Перевод на хинди .

Обновление 1:

Пример кода для получения аналогичного результата

#!/usr/bin/python
# -*- coding: utf-8 -*-
from PIL import Image, ImageDraw, ImageFont, ImageFilter
import cv2
import numpy as np
import sys
import os
reload(sys)
sys.setdefaultencoding('utf8')
#file has only one line with text "Überblick"
file1 = open("write.txt","w+")
file1.write("Überblick")
file1.close()
file2 = open("write.txt","r")
content = file2.readlines()
file2.close()
img = np.zeros((300,300,1), np.uint8)
cv2.imwrite("stack.png",img)
im = Image.open("stack.png")
d = ImageDraw.Draw(im)
helvetica = ImageFont.truetype("arialunicodems.ttf",50)
d.text((0,100), content[0].encode('utf-8'), font=helvetica, fill="white")
im.save("processed.png")
os.remove("stack.png")

См. Файл output.png для вывода. arialunicodems.ttf file

1 Ответ

0 голосов
/ 27 июня 2019

Итак, я понял это сам.Любой, у кого проблема с написанием текста в кодировке Юникод на изображении с использованием Python 2.x и PIL, сначала прочитает эту ссылку .Это очень информативно о кодировании текста в разных версиях Python.Ответ заключается в использовании Unicode ().Удалите .encode ('utf-8') и сделайте так:

d.text((0,100), unicode(content[0]), font=helvetica, fill="white")

unicode () - для преобразования любой строки в строку Unicode, аналогичную str (), для преобразования в строку.Надеюсь, это поможет кому-то нуждающемуся.

...