PIL および TrueType フォントを使用したテキストのディザリング
-
20-09-2019 - |
質問
次のコードを考えてみましょう。PIL からのインポート Image、ImageDraw、ImageFont
def addText(img, lTxt):
FONT_SIZE = 10
INTERLINE_DISTANCE = FONT_SIZE + 1
font = ImageFont.truetype('arial.ttf', FONT_SIZE)
lTxtImageHeight = INTERLINE_DISTANCE * len(lTxt)
# create text image
lTxtImg = Image.new('RGBA', (img.size[1], lTxtImageHeight), 255)
lTxtImgDraw = ImageDraw.Draw(lTxtImg, )
for (i, line) in enumerate(lTxt):
lTxtImgDraw.text((5, i * INTERLINE_DISTANCE), line, font=font, fill='#000000')
# rotate text image
lTxtImg = lTxtImg.rotate(90)
# create new transparent image ret
ret = Image.new('RGBA', (img.size[0] + lTxtImageHeight, img.size[1]), 255)
# paste the image to ret
ret.paste(img, (0,0))
# paste the text to ret
ret.paste(lTxtImg, (img.size[0], 0), lTxtImg)
return ret
img = Image.open('in.png')
addText(img, ['lorem', 'ipsum', 'dolores']).save('out.png')
ここに入力ファイルと出力ファイルがあります これが入力です
http://img16.imageshack.us/img16/8229/73936270.png を入力してください
そしてこれが出力です
出力 http://img94.imageshack.us/img94/531/outj.png
ご覧のとおり、出力画像にはテキストの周囲に赤みがかったノイズが多く含まれています。このディザリングをなくすにはどうすればよいでしょうか?
解決
アーティファクトが最初に現れる場所を特定するために、中間テキスト画像をファイル (テキスト、次に回転されたテキスト) に書き込むことをお勧めします。
もう 1 つの可能性としては、PNG エンコーディングがグレースケール値のないパレットを使用しているため、これらの赤が利用可能な中で最も近いものになっている可能性があります。ただし、imageshack でファイルのエンコードを確認したところ、問題ないようだったので、これが問題ではないと思います。
所属していません StackOverflow