イメージジェネレータ


Pillowパッケージの助けを借りてPythonを使用してランダムなcaptchaイメージを作成するロジックを構築します.
For more detailed reference about pillow check this.
このコマンドを使用してこのパッケージをインストールします
   pip install pillow


新しいイメージを作る


コードのこの部分は、90 x 60で白いイメージを作成して、BlankRangeイメージを保存しました.PNG
   from PIL import Image
   img = Image.new('RGB', (90, 60), color = 'white')
   img.save('blank_image.png')
BlanankRangeイメージPNG

画像にテキストを描画する


今、我々はイメージを作成し、それを保存し、それにいくつかのテキストを追加することができます
   from PIL import Image, ImageDraw
   draw = ImageDraw.Draw(img)
   draw.text((20,20), "Hello", fill=(38, 38, 38))
   img.save('blank_image.png')
Helloは、Poin 10 x 10でIMGオブジェクトで書かれます

線を引く


画像に線を引く
   draw.line((40,30, 150,300), fill=120, width=1)
   draw.line((20,30, 30,20), fill=88, width=2)
塗りつぶし色と幅のサイズを設定します.
(40,30)は1行目の開始点であり(150300)で終了する.
終了点がイメージサイズより大きいことに注意してください.
1行目と同じように、行2は( 20 , 30 )から始まり( 30 , 20 )

描画ポイント


もう少し追加しましょう
画像の点を描画する
   draw.point(((30, 40), (10, 20), (14, 25), (35, 10), (14, 28), (17, 25)), fill="black")
これは、与えられたXY座標でイメージの点点をスローします.

キャプチャ文字列を生成する


この短縮ロジックはURL短縮語で使用されます


RandomHeight文字列関数は長さ5のランダムな文字列を生成します.
import string, random 

# generate thr random captcha string
def random_string():
    # hash length
    N = 5
    s = string.ascii_uppercase + string.ascii_lowercase + string.digits
    # generate a random string of length 5
    random_string = ''.join(random.choices(s, k=N))
    return random_string

Pythonラムダ関数


ラムダとは
は1行、1つの式で特別な関数です.複数の引数を得ることができます.
# Normal funtion
def square(a):
    return a*a

square(5) ---> 25

# lambda funtion
square = lambda a: a*a
square(5) ---> 25
ラムダ関数は、画像内のランダムな場所を取得します
   # lambda function - used to pick a random loaction in image
getit = lambda : (random.randrange(5, 85),random.randrange(5, 55))
これは5と84の間のランダムな値にもかかわらず、
注: 85は取られません
   random.randrange(5, 85)
ランダムに選択される色の値
   # pick a random colors for points
   colors = ["black","red","blue","green",(64, 107, 76),(0, 87, 128),(0, 3, 82)]
   fill_color = [120,145,130,89,58,50,75,86,98,176,]
   # pick a random colors for lines
   fill_color = [(64, 107, 76),(0, 87, 128),(0, 3, 82),(191, 0, 255),(72, 189, 0),(189, 107, 0),(189, 41, 0)]
リストからランダムな値を取得するには、これはランダムな色の値
   random.choice(colors)

CAPTCHAイメージを生成する完全な論理


from PIL import Image, ImageDraw, ImageFont
import string, random 

# generate thr random captcha string
def random_string():
    # hash length
    N = 5
    s = string.ascii_uppercase + string.ascii_lowercase + string.digits
    # generate a random string of length 5
    random_string = ''.join(random.choices(s, k=N))
    return random_string

# lambda function - used to pick a random loaction in image
getit = lambda : (random.randrange(5, 85),random.randrange(5, 55))

# pick a random colors for points
colors = ["black","red","blue","green",(64, 107, 76),(0, 87, 128),(0, 3, 82)]

# fill_color = [120,145,130,89,58,50,75,86,98,176,]
# pick a random colors for lines
fill_color = [(64, 107, 76),(0, 87, 128),(0, 3, 82),(191, 0, 255),(72, 189, 0),(189, 107, 0),(189, 41, 0)]

# generate thr random captcha string
def random_string():
    # hash length
    N = 5
    s = string.ascii_uppercase + string.ascii_lowercase + string.digits
    # generate a random string of length 5
    random_string = ''.join(random.choices(s, k=N))
    return random_string

# generate the captcha image
def gen_captcha_img():
    # create a img object
    img = Image.new('RGB', (90, 60), color="white")
    draw = ImageDraw.Draw(img)

    # get the random string
    captcha_str = random_string()
    # get the text color
    text_colors = random.choice(colors)
    font_name = "fonts/SansitaSwashed-VariableFont_wght.ttf"
    font = ImageFont.truetype(font_name, 18)
    draw.text((20,20), captcha_str, fill=text_colors, font=font)

    # draw some random lines
    for i in range(5,random.randrange(6, 10)):
        draw.line((getit(), getit()), fill=random.choice(fill_color), width=random.randrange(1,3))

    # draw some random points
    for i in range(10,random.randrange(11, 20)):
        draw.point((getit(), getit(), getit(), getit(), getit(), getit(), getit(), getit(), getit(), getit()), fill=random.choice(colors))

    # save image in captcha_img directory
    img.save("captcha_img/"+ captcha_str +".png")

    return True

                          **WE MADE IT** 🥳🥳🥳

あなたは、各々の新しいイメージの線と点を無作為化するのに用いられるコードfor i in range(5,random.randrange(6, 10)):に気がつきます.
これに使用されるフォントはgoogle fonts
https://fonts.google.com/specimen/Sansita+Swashed
注:文字列内の値(バックエンド)を検証するには、文字列をセッションに格納するか、独自の方法を使用できます.
より詳細な画像を生成するには、いくつかの小さな画像を使用して異なる図形をランダムにスローします.

もっと記事






ありがとう、あなたに素晴らしい一日があります。🤪😎