Найти Π² Π”Π·Π΅Π½Π΅
Анастасия Π‘ΠΎΡ„Ρ‚

πŸ–ΌοΈ Pillow talk: ΠΊΠ°ΠΊ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π½Π° Python

ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ β€” это Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅ΠΌΡ‹ ΠΈ Π°Π²Π°Ρ‚Π°Ρ€ΠΊΠΈ. Часто Π½ΡƒΠΆΠ½ΠΎ ΠΈΡ… ΠΎΠ±Ρ€Π΅Π·Π°Ρ‚ΡŒ, ΡΠΆΠ°Ρ‚ΡŒ, Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ водяной Π·Π½Π°ΠΊ ΠΈΠ»ΠΈ просто ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· .png Π² .jpeg. И Ρ‚ΡƒΡ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Pillow β€” ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с изобраТСниями Π½Π° Python. Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅: pip install pillow from PIL import Image
# ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
img = Image.open("example.jpg")
# БохраняСм Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅
img.save("example.png") πŸ” ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ: Допустим, Π½Π°Π΄ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΏΡ€Π΅Π²ΡŒΡŽΡˆΠΊΠΈ 200x200 пиксСлСй: img = Image.open("example.jpg")
# ИзмСняСм Ρ€Π°Π·ΠΌΠ΅Ρ€
resized = img.resize((200, 200))
# БохраняСм
resized.save("example_resized.jpg") πŸ” Π’Π°ΠΆΠ½ΠΎ: resize() ΠΌΠΎΠΆΠ΅Ρ‚ "ΡΠΆΠ°Ρ‚ΡŒ" ΠΈΠ»ΠΈ "Ρ€Π°ΡΡ‚ΡΠ½ΡƒΡ‚ΡŒ" ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ, искаТая ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΈ. Если Ρ…ΠΎΡ‡Π΅ΡˆΡŒ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ сторон β€” смотри ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€. def resize_keep_aspect(img, base_width):
w_percent = base_width / float(img.width)
h_size = int((float(img.height) * float(w_percent)))
return img.resize((base_width, h_size), Image.LANCZOS)
img = Image.open("exam
ОглавлСниС
Pillow talk: ΠΊΠ°ΠΊ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π½Π° Python
Pillow talk: ΠΊΠ°ΠΊ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π½Π° Python

ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ β€” это Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΌΠ΅ΠΌΡ‹ ΠΈ Π°Π²Π°Ρ‚Π°Ρ€ΠΊΠΈ. Часто Π½ΡƒΠΆΠ½ΠΎ ΠΈΡ… ΠΎΠ±Ρ€Π΅Π·Π°Ρ‚ΡŒ, ΡΠΆΠ°Ρ‚ΡŒ, Π½Π°Π»ΠΎΠΆΠΈΡ‚ΡŒ водяной Π·Π½Π°ΠΊ ΠΈΠ»ΠΈ просто ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈΠ· .png Π² .jpeg. И Ρ‚ΡƒΡ‚ ΠΏΡ€ΠΈΡ…ΠΎΠ΄ΠΈΡ‚ Π½Π° ΠΏΠΎΠΌΠΎΡ‰ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Pillow β€” ΠΌΠΎΡ‰Π½Ρ‹ΠΉ инструмСнт для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с изобраТСниями Π½Π° Python.

Π’ этой ΡΡ‚Π°Ρ‚ΡŒΠ΅:

  • 5+ Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Ρ… Π·Π°Π΄Π°Ρ‡
  • ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Ρ‹ΠΉ Ρ€Π°Π·Π±ΠΎΡ€ ΠΊΠΎΠ΄Π°
  • ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ ΠΊ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ строчкС
  • НСмного ΡŽΠΌΠΎΡ€Π°, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π·Π°ΡΠ½ΡƒΡ‚ΡŒ Π½Π°Π΄ пиксСлями 😎

🧰 Установка Pillow

pip install pillow

πŸ§ͺ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 1: ΠžΡ‚ΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΈ сохранСниС изобраТСния

from PIL import Image

# ΠžΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅ΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅
img = Image.open("example.jpg")

# БохраняСм Π² Π΄Ρ€ΡƒΠ³ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅
img.save("example.png")

πŸ” ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ:

  • Image.open() β€” ΠΎΡ‚ΠΊΡ€Ρ‹Π²Π°Π΅Ρ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π² любом популярном Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅.
  • img.save() β€” сохраняСм, ΠΌΠΎΠΆΠ½ΠΎ Π² Π½ΠΎΠ²ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅.

πŸ“ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 2: РСсайз изобраТСния (resize)

Допустим, Π½Π°Π΄ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π΄ΠΎ ΠΏΡ€Π΅Π²ΡŒΡŽΡˆΠΊΠΈ 200x200 пиксСлСй:

img = Image.open("example.jpg")

# ИзмСняСм Ρ€Π°Π·ΠΌΠ΅Ρ€
resized = img.resize((200, 200))

# БохраняСм
resized.save("example_resized.jpg")

πŸ” Π’Π°ΠΆΠ½ΠΎ: resize() ΠΌΠΎΠΆΠ΅Ρ‚ "ΡΠΆΠ°Ρ‚ΡŒ" ΠΈΠ»ΠΈ "Ρ€Π°ΡΡ‚ΡΠ½ΡƒΡ‚ΡŒ" ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ, искаТая ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΈ. Если Ρ…ΠΎΡ‡Π΅ΡˆΡŒ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ сторон β€” смотри ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€.

πŸ“ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 3: РСсайз с сохранСниСм ΠΏΡ€ΠΎΠΏΠΎΡ€Ρ†ΠΈΠΉ

def resize_keep_aspect(img, base_width):
w_percent = base_width / float(img.width)
h_size = int((float(img.height) * float(w_percent)))
return img.resize((base_width, h_size), Image.LANCZOS)

img = Image.open("example.jpg")
resized = resize_keep_aspect(img, 300)
resized.save("example_resized.jpg")

πŸ’‘ Image.LANCZOS β€” ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ½ΡƒΡ‚Ρ‹ΠΉ Ρ„ΠΈΠ»ΡŒΡ‚Ρ€ для Π»ΡƒΡ‡ΡˆΠ΅Π³ΠΎ качСства ΠΏΡ€ΠΈ ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠΈ изобраТСния.

πŸ’Ύ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 4: Π‘ΠΆΠ°Ρ‚ΠΈΠ΅ изобраТСния (ΡƒΠΌΠ΅Π½ΡŒΡˆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·ΠΌΠ΅Ρ€Π° Ρ„Π°ΠΉΠ»Π°)

img = Image.open("example.jpg")

# БохраняСм с качСством 60 (ΠΈΠ· 100)
img.save("example_compressed.jpg", quality=60, optimize=True)

πŸ“¦ Π­Ρ‚ΠΎ ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€ Ρ„Π°ΠΉΠ»Π°, особСнно ΠΏΠΎΠ»Π΅Π·Π½ΠΎ для сайтов.

πŸ’§ ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 5: Π”ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ водяного Π·Π½Π°ΠΊΠ°

from PIL import ImageDraw, ImageFont

img = Image.open("example.jpg").convert("RGBA")

# Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ Π½ΠΎΠ²Ρ‹ΠΉ слой
watermark = Image.new("RGBA", img.size, (255,255,255,0))
draw = ImageDraw.Draw(watermark)

# НастраиваСм ΡˆΡ€ΠΈΡ„Ρ‚
font = ImageFont.truetype("arial.ttf", 36)

# ПишСм тСкст Π²Π½ΠΈΠ·Ρƒ справа
text = "Β© MyBrand"
textwidth, textheight = draw.textsize(text, font)
x = img.width - textwidth - 10
y = img.height - textheight - 10

draw.text((x, y), text, font=font, fill=(255,255,255,128))

# ОбъСдиняСм
combined = Image.alpha_composite(img, watermark)
combined.convert("RGB").save("example_watermarked.jpg")

πŸ’§ Водяной Π·Π½Π°ΠΊ ΠΏΠΎΠ»ΡƒΠΏΡ€ΠΎΠ·Ρ€Π°Ρ‡Π½Ρ‹ΠΉ ΠΈ Π½Π΅ ΠΏΠΎΡ€Ρ‚ΠΈΡ‚ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅.

πŸ” ΠŸΡ€ΠΈΠΌΠ΅Ρ€ 6: ΠŸΠ°ΠΊΠ΅Ρ‚Π½Π°Ρ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° (всС .jpg Π² ΠΏΠ°ΠΏΠΊΠ΅ β†’ .webp)

import os

for filename in os.listdir("images"):
if filename.endswith(".jpg"):
img = Image.open(os.path.join("images", filename))
base = os.path.splitext(filename)[0]
img.save(os.path.join("images", base + ".webp"), "WEBP")

πŸŒ€ ΠžΡ‚Π»ΠΈΡ‡Π½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚Π°Ρ†ΠΈΠΈ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅Π΄ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΎΠΉ Π½Π° сайт.

🧠 Π§Ρ‚ΠΎ Π΅Ρ‰Ρ‘ ΡƒΠΌΠ΅Π΅Ρ‚ Pillow?

  • ΠšΠ°Π΄Ρ€ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (crop)
  • ΠŸΠΎΠ²ΠΎΡ€ΠΎΡ‚Ρ‹ (rotate, transpose)
  • Π€ΠΈΠ»ΡŒΡ‚Ρ€Ρ‹ ΠΈ эффСкты (ImageFilter)
  • Π Π°Π±ΠΎΡ‚Π° с Π°Π»ΡŒΡ„Π°-ΠΊΠ°Π½Π°Π»ΠΎΠΌ ΠΈ масками
  • РисованиС ΠΏΠΎΠ²Π΅Ρ€Ρ… изобраТСния (ImageDraw)
  • ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° дСсятков Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΎΠ²: JPG, PNG, WEBP, GIF, BMP, ICO, TIFF...

πŸ”š Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π‘ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Pillow ΠΌΠΎΠΆΠ½ΠΎ Π»Π΅Π³ΠΊΠΎ:

  • ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΡ‚ΡŒ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ
  • ΠΏΠ΅Ρ€Π΅ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π΅Ρ‘ Π² Π½ΡƒΠΆΠ½Ρ‹ΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚
  • Π·Π°Ρ‰ΠΈΡ‚ΠΈΡ‚ΡŒ Π»ΠΎΠ³ΠΎΡ‚ΠΈΠΏΠΎΠΌ
  • ΠΈ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ всё это Π² ΠΊΠΎΠ΄Π΅, Π±Π΅Π· Photoshop ΠΈ Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΎΠ±Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ