Pythonっていいですよね!初心者でもわかりやすいし、業務自動化もできるし、機械学習だってできちゃう!
しかし、Pythonでコード書いてたら突如「UnicodeEncodeError: ‘latin-1’ codec can’t encode characters in position 0-14: ordinal not in range(256)」というエラーが!どうしたらいい!
![ホームページ・インフラ担当が副業やるってよ!](https://m32006400n.xsrv.jp/wp-content/uploads/2023/03/205437d4862ecda7abe6ca8da7998d90.webp)
当サイトではエラー解決の情報を掲載しています。興味がある方は是非ご覧ください。
![](https://m32006400n.xsrv.jp/wp-content/uploads/2023/06/cad7d857e36e4047fe51b32c8a005e2e-160x90.webp)
![](https://m32006400n.xsrv.jp/wp-content/uploads/2023/06/cfb2b099464c6db317374164621d9801-160x90.webp)
エラーの原因
「UnicodeEncodeError: ‘latin-1’ codec can’t encode characters」のエラーは、特定の文字列をエンコードまたはデコードしようとしたときに、その文字列が使用しているコーデック(この場合は’latin-1’)でサポートされていない文字を含んでいる場合に発生します。
このエラーの一般的な原因は以下の通りです
![](https://m32006400n.xsrv.jp/wp-content/uploads/2022/10/7cb69c245fbc719356a96bcf6af45097.png)
- ファイルのパスや名前に非ASCII文字が含まれている場合。
- 画像に追加するテキストに非ASCII文字が含まれている場合。
この問題を解決するための一般的な方法は、文字列のエンコーディングを’utf-8’に変更することです。ただし、このエラーがPillowライブラリの内部で発生する場合、WebPの保存時にエンコーディングを指定することはできません。
つまり、Pillowライブラリのデフォルトのフォントは、日本語である「ひらがな」「カタカナ」「漢字」の文字をサポートしていないということです。だから、エラーが発生します。
解決策
日本語をサポートしているフォントを使うことで解決します。ttfやttcなどをパソコンのフォルダを指定して、パソコン内にあるフォントを使うことで解決します。
実際にコードを使って説明した方がわかりやすいので、コードを書いていきます。
まずは、エラーが実際に発生したコードを書きます。
#画像に指定の文字を書き込むコード(エラーが発生したコード)
import os
import random
from PIL import Image, ImageDraw, ImageFont
def add_text_to_image(image_path, output_path, text):
# 画像を開く
image = Image.open(image_path)
# 描画オブジェクトを作成
draw = ImageDraw.Draw(image)
# フォントの設定 (デフォルトのフォントを使用)
font = ImageFont.load_default()
# 画像のサイズを取得
width, height = image.size
# テキストのサイズを取得
text_width, text_height = draw.textsize(text, font=font)
# テキストの位置を計算 (画像の中央に配置)
x = (width - text_width) / 2
y = (height - text_height) / 2
# テキストを画像に描画
draw.text((x, y), text, font=font, fill="white")
# 画像をWebP形式で保存
image.save(output_path, "WEBP")
def main():
folder_path = "simple"
png_files = [f for f in os.listdir(folder_path) if f.endswith('.png')]
if not png_files:
print("PNGファイルが見つかりませんでした。")
return
# ランダムにPNGファイルを選択
selected_file = random.choice(png_files)
input_path = os.path.join(folder_path, selected_file)
# 出力パスを設定 (同じフォルダ内にWebP形式で保存)
output_path = os.path.join(folder_path, selected_file.replace('.png', '.webp'))
text = "ここにテキストを入れる"
add_text_to_image(input_path, output_path, text)
print(f"{output_path} にテキストを追加しました。")
if __name__ == "__main__":
main()
上記のコードでは日本語の「ひらがな」「カタカナ」「漢字」を画像に書き込むことはできませんでした。
では、解決したコードを下記に記載いたします。
#画像に指定の文字を書き込むコード(解決済み)
import os
import random
from PIL import Image, ImageDraw, ImageFont
def add_text_to_image(image_path, output_path, text, font_path):
# 画像を開く
image = Image.open(image_path)
# 描画オブジェクトを作成
draw = ImageDraw.Draw(image)
# 日本語をサポートするフォントを指定
font = ImageFont.truetype(font_path, 30) # 30はフォントサイズ
# 画像のサイズを取得
width, height = image.size
# テキストのサイズを取得
text_width, text_height = draw.textsize(text, font=font)
# テキストの位置を計算 (画像の中央に配置)
x = (width - text_width) / 2
y = (height - text_height) / 2
# テキストを画像に描画
draw.text((x, y), text, font=font, fill="white")
# 画像をWebP形式で保存
image.save(output_path, "WEBP")
def main():
folder_path = "simple"
png_files = [f for f in os.listdir(folder_path) if f.endswith('.png')]
if not png_files:
print("PNGファイルが見つかりませんでした。")
return
# ランダムにPNGファイルを選択
selected_file = random.choice(png_files)
input_path = os.path.join(folder_path, selected_file)
# 出力パスを設定 (同じフォルダ内にWebP形式で保存)
output_path = os.path.join(folder_path, selected_file.replace('.png', '.webp'))
text = "ひらがなカタカナ漢字" # 日本語のテキスト
font_path = "path_to_your_NotoSansCJKjp-Regular.ttf" # 日本語フォントのパスを指定
add_text_to_image(input_path, output_path, text, font_path)
print(f"{output_path} にテキストを追加しました。")
if __name__ == "__main__":
main()
変数font_pathにパソコンに入っている好きなフォントを設定してあげれば、画像に好きなフォントで文字を書き込むことができます。
以下が完成品です。
![ひらがなカタカナ漢字の文字をPythonを使って書き込んだ画像](https://m32006400n.xsrv.jp/wp-content/uploads/2023/09/1.webp)
ひらがなカタカナ漢字の文字をPythonを使って書き込んだ画像
まとめ
「UnicodeEncodeError: ‘latin-1’ codec can’t encode characters」というエラーは、’latin-1’コーデックでサポートされていない文字をエンコードまたはデコードしようとするときに発生します。このエラーは、ファイルのパスや名前、画像に追加するテキストに非ASCII文字が含まれている場合によく見られます。エラーを解決するための方法として、文字列のエンコーディングを’utf-8’に変更することや、日本語をサポートしているフォントを使用することです。
具体的には、Pillowライブラリのデフォルトフォントは日本語の「ひらがな」「カタカナ」「漢字」をサポートしていないため、これらの文字を画像に書き込むとエラーが発生します。解決策として、日本語をサポートしているフォントを指定して使用することで、この問題を回避することができます。
最後に簡単に内容をまとめたいと思います。
簡単まとめ
- ‘latin-1’コーデックでサポートされていない文字を扱うと「UnicodeEncodeError」が発生する。
- Pillowライブラリのデフォルトフォントは日本語をサポートしていない。
- 日本語をサポートしているフォントを使用することでエラーを解決できる。
この記事を気に入っていただけたら、コメントやシェアをしていただけるととても励みになります!これからも、Pythonの疑問や困ったを解決情報を発信していきますので、たまにサイトをチェックしていただけると、とっても嬉しいです(‘ω’)ノ。
SNSのフォローボタンを、ポチってくれるとめっちゃ嬉しいです👍
ではでは、最後までご覧いただきありがとうございました。
Twitter:@Uriuri_writer
Follow @Uriuri_writer
Instagram:@uriuri_writer
Instagram
コメント