Konuyu Açan
#0
Python Pillow Kullanımı
Merhaba arkadaşlar,
Bugün Python'da görsel işleme dendiğinde akla ilk gelen, belki de en güçlü kütüphanelerden biri olan Pillow'u derinlemesine inceleyeceğiz. Eminim birçoğunuz projelerinizde resimlerle ilgili bir şeyler yapmaya kalkıştığınızda ya Pillow ile karşılaşmışsınızdır ya da bu ihtiyacınızı nasıl gidereceğinizi merak etmişsinizdir. Gelin bu kütüphanenin sunduğu imkanlara, temelden başlayarak daha ileri seviye uygulamalara doğru bir yolculuğa çıkalım.
Giriş: Resim İşlemede Neden Pillow?
Pillow, aslında Python Imaging Library (PIL) adındaki eski ama çok güçlü kütüphanenin güncel, bakımı yapılan ve Python 3 ile uyumlu hale getirilmiş bir "fork"u, yani devamıdır. PIL, uzun yıllar boyunca Python ekosisteminde resim işleme standardı olmuştu ama geliştirilmesi durunca Pillow bayrağı devraldı. Peki neden Pillow? Çünkü JPEG, PNG, BMP, GIF gibi birçok popüler dosya formatını destekliyor, resimleri açma, kaydetme, yeniden boyutlandırma, kırpma, döndürme gibi temel işlemlerden tutun da filtre uygulama, renk manipülasyonu, metin ve şekil çizimine kadar geniş bir yelpazede fonksiyonellik sunuyor. Üstelik kullanımı oldukça basit ve Python'ın felsefesine uygun, okunabilir bir yapısı var.
Kurulumu da oldukça kolaydır, çoğu Python kütüphanesinde olduğu gibi:
Bu komutu çalıştırdıktan sonra, artık projelerinizde Pillow'u kullanmaya hazırsınız demektir.
Temel Resim Yönetimi: Açma, Kaydetme ve Bilgi Alma
Bir resimle çalışmaya başlamanın ilk adımı, onu belleğe yüklemektir. Pillow'da bu iş için Image modülündeki open() fonksiyonunu kullanıyoruz. Açtığımız resmi üzerinde işlemler yaptıktan sonra kaydetmek için de save() metodunu kullanıyoruz. İşte basit bir örnek:
Burada gördüğünüz gibi, open() ile bir resim dosyasını açıyoruz. Sonra .size, .mode ve .format gibi özelliklerle resmin temel bilgilerini alabiliyoruz. .size bize (genişlik, yükseklik) şeklinde bir tuple döndürür. .mode ise resmin renk modunu belirtir; örneğin 'RGB' (kırmızı, yeşil, mavi), 'RGBA' (RGB + alfa kanalı - şeffaflık için), veya 'L' (gri tonlama - luminance) gibi. .format ise dosyanın orijinal formatını söyler.
Image.new() ise sıfırdan bir resim oluşturmak istediğimizde harika bir seçenek. İlk parametre renk modu, ikincisi boyut (genişlik, yükseklik tuple'ı), üçüncüsü ise opsiyonel olarak arka plan rengi. Renkleri isimleriyle ('red', 'blue') veya RGB tuple'ı olarak ((255, 0, 0)) belirtebilirsiniz.
Resimleri Yeniden Şekillendirme: Boyutlandırma, Kırpma ve Döndürme
Resimlerle çalışırken en sık yaptığımız işlemlerden biri, boyutlarını değiştirmek veya belirli bölgelerini almak, bazen de yönünü değiştirmektir. Pillow bu konuda bize çok esnek araçlar sunuyor.
Renklerle Dans: Modlar ve Kanallar
Resimlerin renk modları, piksellerin nasıl temsil edildiğini belirler. 'RGB' en yaygın olanıdır (kırmızı, yeşil, mavi bileşenleri 0-255 arası değerlerle), 'RGBA' şeffaflık (alpha) kanalı ekler, 'L' gri tonlamadır, 'CMYK' ise baskı için kullanılır. Bazen bir resmi başka bir renk moduna dönüştürmek, veya renk kanallarını ayırıp ayrı ayrı işlem yapmak isteyebiliriz.
Piksel Seviyesinde Kontrol: getpixel, putpixel ve load
Bazen daha ince detaylara inip tek tek pikseller üzerinde işlem yapmak isteyebiliriz. Pillow, bunun için getpixel() ve putpixel() metodlarını sunar. Ancak bu metodlar, büyük resimler üzerinde döngü içinde kullanıldığında performans açısından pek verimli değildir. Eğer gerçekten piksel seviyesinde yoğun işlem yapacaksanız, load() metodunu kullanarak piksel verilerine daha hızlı erişim sağlayan bir piksel erişim nesnesi almanız daha doğru olur.
Gördüğünüz gibi, pixels[x, y] doğrudan piksel değerine erişmenizi sağlıyor, bu da döngülerde çok daha hızlı çalışır.
Görsel Efektler ve İyileştirmeler: Filtreler ve Enhancer'lar
Pillow, resimlere çeşitli görsel efektler uygulamak veya kalitesini artırmak için iki ana modül sunar: ImageFilter ve ImageEnhance.
Resme Dokunuşlar: Metin ve Şekil Çizimi
Resimlerin üzerine metin veya geometrik şekiller çizmek de sıkça karşılaşılan bir ihtiyaçtır, özellikle filigran ekleme, kartvizit oluşturma veya basit grafikler çizme gibi durumlarda. Pillow'da bu iş için ImageDraw modülü kullanılır. Ayrıca, metin çizerken fontları yüklemek için ImageFont modülüne ihtiyacımız olacak.
Pillow ile Pratik Uygulamalar ve İpuçları
Pillow'u kullanarak yapabileceğiniz şeyler gerçekten çok fazla. İşte günlük hayatta veya projelerde sıkça karşınıza çıkabilecek birkaç pratik uygulama fikri:
[list]
Filigran Ekleme (Watermarking): Telif haklarını korumak veya resmin kaynağını belirtmek için resimlerin üzerine şeffaf bir metin veya logo eklemek çok yaygın bir uygulamadır. Bunu ImageDraw ve ImageFont modüllerini kullanarak kolayca yapabiliriz. Şeffaflık için RGBA modunu ve metnin rengini alfa kanalıyla ayarlamayı unutmayın.
Merhaba arkadaşlar,
Bugün Python'da görsel işleme dendiğinde akla ilk gelen, belki de en güçlü kütüphanelerden biri olan Pillow'u derinlemesine inceleyeceğiz. Eminim birçoğunuz projelerinizde resimlerle ilgili bir şeyler yapmaya kalkıştığınızda ya Pillow ile karşılaşmışsınızdır ya da bu ihtiyacınızı nasıl gidereceğinizi merak etmişsinizdir. Gelin bu kütüphanenin sunduğu imkanlara, temelden başlayarak daha ileri seviye uygulamalara doğru bir yolculuğa çıkalım.
Giriş: Resim İşlemede Neden Pillow?
Pillow, aslında Python Imaging Library (PIL) adındaki eski ama çok güçlü kütüphanenin güncel, bakımı yapılan ve Python 3 ile uyumlu hale getirilmiş bir "fork"u, yani devamıdır. PIL, uzun yıllar boyunca Python ekosisteminde resim işleme standardı olmuştu ama geliştirilmesi durunca Pillow bayrağı devraldı. Peki neden Pillow? Çünkü JPEG, PNG, BMP, GIF gibi birçok popüler dosya formatını destekliyor, resimleri açma, kaydetme, yeniden boyutlandırma, kırpma, döndürme gibi temel işlemlerden tutun da filtre uygulama, renk manipülasyonu, metin ve şekil çizimine kadar geniş bir yelpazede fonksiyonellik sunuyor. Üstelik kullanımı oldukça basit ve Python'ın felsefesine uygun, okunabilir bir yapısı var.
Kurulumu da oldukça kolaydır, çoğu Python kütüphanesinde olduğu gibi:
CODE
12
pip install Pillow
Bu komutu çalıştırdıktan sonra, artık projelerinizde Pillow'u kullanmaya hazırsınız demektir.
Temel Resim Yönetimi: Açma, Kaydetme ve Bilgi Alma
Bir resimle çalışmaya başlamanın ilk adımı, onu belleğe yüklemektir. Pillow'da bu iş için Image modülündeki open() fonksiyonunu kullanıyoruz. Açtığımız resmi üzerinde işlemler yaptıktan sonra kaydetmek için de save() metodunu kullanıyoruz. İşte basit bir örnek:
CODE
12345678910111213141516171819202122232425262728
from PIL import Image
[b]Bir resmi açalım[/b]
try:
img = Image.open('ornek.jpg')
print("Resim başarıyla açıldı.")
except FileNotFoundError:
print("ornek.jpg dosyası bulunamadı. Lütfen aynı dizine bir resim koyun.")
exit()
[b]Resim hakkında bilgi alalım[/b]
print(f"Resim Boyutu: {img.size}") # (genişlik, yükseklik)
print(f"Resim Modu: {img.mode}") # RGB, L (grayscale), RGBA vb.
print(f"Resim Formatı: {img.format}") # JPEG, PNG vb.
[b]Açılan resmi gösterelim (isteğe bağlı, bazı sistemlerde çalışmayabilir)[/b]
[b]img.show()[/b]
[b]Resmi farklı bir isimle kaydedelim (örneğin PNG olarak)[/b]
img.save('ornek_kaydedildi.png')
print("Resim 'ornek_kaydedildi.png' olarak kaydedildi.")
[b]Yeni boş bir resim oluşturalım (örneğin 200x150 boyutunda, mavi renkli)[/b]
genislik, yukseklik = 200, 150
yeni_resim = Image.new('RGB', (genislik, yukseklik), color = 'blue')
yeni_resim.save('mavi_resim.png')
print("Mavi bir resim 'mavi_resim.png' olarak oluşturuldu.")
Burada gördüğünüz gibi, open() ile bir resim dosyasını açıyoruz. Sonra .size, .mode ve .format gibi özelliklerle resmin temel bilgilerini alabiliyoruz. .size bize (genişlik, yükseklik) şeklinde bir tuple döndürür. .mode ise resmin renk modunu belirtir; örneğin 'RGB' (kırmızı, yeşil, mavi), 'RGBA' (RGB + alfa kanalı - şeffaflık için), veya 'L' (gri tonlama - luminance) gibi. .format ise dosyanın orijinal formatını söyler.
Image.new() ise sıfırdan bir resim oluşturmak istediğimizde harika bir seçenek. İlk parametre renk modu, ikincisi boyut (genişlik, yükseklik tuple'ı), üçüncüsü ise opsiyonel olarak arka plan rengi. Renkleri isimleriyle ('red', 'blue') veya RGB tuple'ı olarak ((255, 0, 0)) belirtebilirsiniz.
Resimleri Yeniden Şekillendirme: Boyutlandırma, Kırpma ve Döndürme
Resimlerle çalışırken en sık yaptığımız işlemlerden biri, boyutlarını değiştirmek veya belirli bölgelerini almak, bazen de yönünü değiştirmektir. Pillow bu konuda bize çok esnek araçlar sunuyor.
- Boyutlandırma (resize()): Bir resmi belirli bir genişlik ve yüksekliğe sığdırmak istediğimizde resize() metodunu kullanırız. Bu metod, yeni boyutları bir tuple olarak alır. Önemli bir nokta, resmin en boy oranını korumak isteyip istemediğinizdir. Eğer korumazsanız resim bozulabilir. Genellikle orantılı boyutlandırma için önce yeni boyutu hesaplamak iyi bir fikirdir. Ayrıca, boyutlandırma sırasında piksel verilerinin nasıl yorumlanacağını belirleyen filtreler de kullanabiliriz. Image.LANCZOS veya Image.BICUBIC genellikle daha iyi sonuçlar verirken, Image.NEAREST en hızlısıdır ancak pikselleşmeye yol açabilir.
CODE
123456789101112131415161718192021222324252627
from PIL import Image
try:
img = Image.open('ornek.jpg')
except FileNotFoundError:
print("ornek.jpg dosyası bulunamadı.")
exit()
[b]Orijinal boyutları alalım[/b]
orijinal_genislik, orijinal_yukseklik = img.size
print(f"Orijinal Boyut: {orijinal_genislik}x{orijinal_yukseklik}")
[b]Yeni boyutları belirleyelim (örneğin yarıya düşürelim)[/b]
yeni_genislik = orijinal_genislik // 2
yeni_yukseklik = orijinal_yukseklik // 2
[b]Resmi boyutlandıralım (LANCZOS filtresiyle daha kaliteli sonuçlar)[/b]
img_resized = img.resize((yeni_genislik, yeni_yukseklik), Image.LANCZOS)
img_resized.save('ornek_yari_boyut.jpg')
print(f"Resim {yeni_genislik}x{yeni_yukseklik} boyutuna getirildi ve kaydedildi.")
[b]Küçük resim (thumbnail) oluşturmak için pratik bir yöntem: thumbnail()[/b]
[b]Bu metod, en boy oranını koruyarak resmin boyutunu verilen kutuya sığacak şekilde küçültür.[/b]
img.thumbnail((128, 128)) # Max 128x128 boyutunda bir thumbnail
img.save('ornek_thumbnail.jpg')
print("Thumbnail oluşturuldu ve kaydedildi.")
- Kırpma (crop()): Resmin sadece belirli bir bölgesini almak istediğimizde crop() metodunu kullanırız. Bu metod, sol üst köşenin (x, y) koordinatları ve sağ alt köşenin (x, y) koordinatlarını içeren dört elemanlı bir tuple alır: b[/b]. Koordinat sistemi sol üst köşeden başlar ve sağa doğru X, aşağı doğru Y artar.
CODE
12345678910111213141516171819
from PIL import Image
try:
img = Image.open('ornek.jpg')
except FileNotFoundError:
print("ornek.jpg dosyası bulunamadı.")
exit()
[b]Resmin ortasından 200x200 piksellik bir kare kırpalım[/b]
genislik, yukseklik = img.size
sol = (genislik - 200) // 2
ust = (yukseklik - 200) // 2
sag = sol + 200
alt = ust + 200
img_cropped = img.crop((sol, ust, sag, alt))
img_cropped.save('ornek_kirpilmis.jpg')
print("Resim ortasından 200x200 olarak kırpıldı ve kaydedildi.")
- Döndürme (rotate()) ve Çevirme (transpose()): Resimleri belirli bir açıyla döndürmek veya eksenlerinde çevirmek isteyebiliriz. rotate() metoduna derece cinsinden bir açı vererek döndürebiliriz. transpose() ise daha çok 90 derece dönüşler veya simetrik çevirmeler için kullanılır ve daha performanslıdır.
CODE
1234567891011121314151617181920212223
from PIL import Image
try:
img = Image.open('ornek.jpg')
except FileNotFoundError:
print("ornek.jpg dosyası bulunamadı.")
exit()
[b]Resmi 45 derece döndürelim (arka planı şeffaf yapsın, yoksa siyah olur)[/b]
img_rotated = img.rotate(45, expand=True) # expand=True yeni boyutlara göre resmi genişletir
img_rotated.save('ornek_45_derece_donmus.png') # PNG formatı şeffaflığı destekler
print("Resim 45 derece döndürüldü ve kaydedildi.")
[b]Resmi 90 derece saat yönünde döndürelim (transpose ile daha hızlı)[/b]
img_transposed_90 = img.transpose(Image.ROTATE_90)
img_transposed_90.save('ornek_90_derece_donmus.jpg')
print("Resim 90 derece döndürüldü (transpose) ve kaydedildi.")
[b]Resmi yatay olarak çevirelim[/b]
img_flipped_h = img.transpose(Image.FLIP_LEFT_RIGHT)
img_flipped_h.save('ornek_yatay_cevrilmis.jpg')
print("Resim yatay olarak çevrildi ve kaydedildi.")
Renklerle Dans: Modlar ve Kanallar
Resimlerin renk modları, piksellerin nasıl temsil edildiğini belirler. 'RGB' en yaygın olanıdır (kırmızı, yeşil, mavi bileşenleri 0-255 arası değerlerle), 'RGBA' şeffaflık (alpha) kanalı ekler, 'L' gri tonlamadır, 'CMYK' ise baskı için kullanılır. Bazen bir resmi başka bir renk moduna dönüştürmek, veya renk kanallarını ayırıp ayrı ayrı işlem yapmak isteyebiliriz.
- Mod Dönüşümleri (convert()): Bir resmin renk modunu değiştirmek için convert() metodunu kullanırız. Örneğin, bir renkli resmi gri tonlamaya çevirmek veya bir JPEG resmine şeffaflık eklemek (ki bu durumda PNG gibi bir formatta kaydetmeniz gerekir) isteyebilirsiniz.
CODE
123456789101112131415161718
from PIL import Image
try:
img = Image.open('ornek.jpg')
except FileNotFoundError:
print("ornek.jpg dosyası bulunamadı.")
exit()
[b]Renkli resmi gri tonlamaya çevirelim[/b]
img_grayscale = img.convert('L') # 'L' luminance (gri tonlama) modudur
img_grayscale.save('ornek_gri_tonlama.jpg')
print("Resim gri tonlamaya çevrildi ve kaydedildi.")
[b]Resmi RGBA moduna çevirelim (şeffaflık ekleyebiliriz)[/b]
img_rgba = img.convert('RGBA')
img_rgba.save('ornek_rgba.png') # Şeffaflık için PNG gibi bir format gerekir
print("Resim RGBA moduna çevrildi ve kaydedildi.")
- Kanallara Ayırma ve Birleştirme (split() ve Image.merge()): 'RGB' bir resim aslında Kırmızı, Yeşil ve Mavi olmak üzere üç ayrı kanaldan oluşur. Bu kanalları split() metoduyla ayırıp her birini ayrı bir gri tonlama resmi gibi işleyebiliriz. Sonra istersek Image.merge() ile tekrar birleştirebiliriz. Bu, renk manipülasyonları için oldukça güçlü bir yöntemdir.
CODE
12345678910111213141516171819202122232425262728
from PIL import Image
try:
img = Image.open('ornek.jpg')
except FileNotFoundError:
print("ornek.jpg dosyası bulunamadı.")
exit()
[b]Resmi RGB kanallarına ayıralım[/b]
r, g, b = img.split()
[b]Her bir kanalı ayrı ayrı kaydedelim[/b]
r.save('ornek_kirmizi_kanali.jpg')
g.save('ornek_yesil_kanali.jpg')
b.save('ornek_mavi_kanali.jpg')
print("Kırmızı, yeşil ve mavi kanallar ayrı ayrı kaydedildi.")
[b]Kanalları tekrar birleştirelim (örneğin orijinal sırayla)[/b]
img_merged = Image.merge('RGB', (r, g, b))
img_merged.save('ornek_birlesmis.jpg')
print("Kanallar tekrar birleştirildi ve kaydedildi.")
[b]Kanalların yerini değiştirerek renk oyunları yapabiliriz[/b]
[b]Örneğin, mavi ve kırmızı kanalları yer değiştirelim[/b]
img_swapped = Image.merge('RGB', (b, g, r)) # Kırmızı yerine Mavi, Mavi yerine Kırmızı
img_swapped.save('ornek_renk_degismis.jpg')
print("Kanalların yeri değiştirilerek yeni bir resim oluşturuldu.")
Piksel Seviyesinde Kontrol: getpixel, putpixel ve load
Bazen daha ince detaylara inip tek tek pikseller üzerinde işlem yapmak isteyebiliriz. Pillow, bunun için getpixel() ve putpixel() metodlarını sunar. Ancak bu metodlar, büyük resimler üzerinde döngü içinde kullanıldığında performans açısından pek verimli değildir. Eğer gerçekten piksel seviyesinde yoğun işlem yapacaksanız, load() metodunu kullanarak piksel verilerine daha hızlı erişim sağlayan bir piksel erişim nesnesi almanız daha doğru olur.
CODE
1234567891011121314151617181920212223242526272829303132
from PIL import Image
try:
img = Image.open('ornek.jpg')
except FileNotFoundError:
print("ornek.jpg dosyası bulunamadı.")
exit()
[b]Resmi önce RGB moduna çevirelim ki piksel değerlerini kolayca işleyelim[/b]
img_rgb = img.convert('RGB')
genislik, yukseklik = img_rgb.size
[b]getpixel() ve putpixel() ile bir pikseli değiştirelim[/b]
[b]Örneğin, sol üst köşedeki pikseli kırmızı yapalım[/b]
img_copy = img_rgb.copy() # Orijinal resmi bozmamak için kopyasını alıyoruz
img_copy.putpixel((0, 0), (255, 0, 0)) # (x, y) koordinatı ve (R, G, B) değeri
img_copy.save('ornek_ilk_piksel_kirmizi.jpg')
print("İlk pikseli kırmızı olan resim kaydedildi.")
[b]Şimdi daha performanslı olan load() metodunu kullanalım[/b]
[b]Resmin yarısını gri tonlamaya çevirelim (basit bir örnek)[/b]
pixels = img_rgb.load() # Piksel erişim nesnesini alıyoruz
for y in range(yukseklik):
for x in range(genislik // 2): # Sadece sol yarıyı işleyelim
r, g, b = pixels[x, y]
gri_deger = int((r + g + b) / 3) # Basit bir gri tonlama hesaplaması
pixels[x, y] = (gri_deger, gri_deger, gri_deger)
img_rgb.save('ornek_yarisi_gri.jpg')
print("Resmin sol yarısı griye çevrildi ve kaydedildi.")
Gördüğünüz gibi, pixels[x, y] doğrudan piksel değerine erişmenizi sağlıyor, bu da döngülerde çok daha hızlı çalışır.
Görsel Efektler ve İyileştirmeler: Filtreler ve Enhancer'lar
Pillow, resimlere çeşitli görsel efektler uygulamak veya kalitesini artırmak için iki ana modül sunar: ImageFilter ve ImageEnhance.
- ImageFilter: Bulanıklaştırma (blur), keskinleştirme (sharpen), kabartma (emboss) gibi önceden tanımlanmış filtreleri uygulamak için kullanılır.
CODE
1234567891011121314151617181920212223
from PIL import Image, ImageFilter
try:
img = Image.open('ornek.jpg')
except FileNotFoundError:
print("ornek.jpg dosyası bulunamadı.")
exit()
[b]Resmi bulanıklaştıralım (Gaussian Blur)[/b]
img_blurred = img.filter(ImageFilter.GaussianBlur(radius=5))
img_blurred.save('ornek_bulanik.jpg')
print("Resim bulanıklaştırıldı ve kaydedildi.")
[b]Resmi keskinleştirelim[/b]
img_sharpened = img.filter(ImageFilter.SHARPEN)
img_sharpened.save('ornek_keskin.jpg')
print("Resim keskinleştirildi ve kaydedildi.")
[b]Resme kabartma efekti verelim[/b]
img_embossed = img.filter(ImageFilter.EMBOSS)
img_embossed.save('ornek_kabartma.jpg')
print("Resme kabartma efekti verildi ve kaydedildi.")
- ImageEnhance: Resmin parlaklığını, kontrastını, renk dengesini veya keskinliğini ayarlamak için kullanılır. Bu modül, Brightness, Contrast, Color ve Sharpness gibi sınıflar içerir. Her bir enhancer sınıfı, bir enhance() metoduyla bir faktör değeri alarak ayarlama yapar. 1.0 orijinal halidir, 1.0'dan büyük değerler artırır, küçük değerler azaltır.
CODE
1234567891011121314151617181920212223242526
from PIL import Image, ImageEnhance
try:
img = Image.open('ornek.jpg')
except FileNotFoundError:
print("ornek.jpg dosyası bulunamadı.")
exit()
[b]Parlaklığı artıralım[/b]
enhancer = ImageEnhance.Brightness(img)
img_bright = enhancer.enhance(1.5) # %50 daha parlak
img_bright.save('ornek_parlak.jpg')
print("Resmin parlaklığı artırıldı ve kaydedildi.")
[b]Kontrastı artıralım[/b]
enhancer = ImageEnhance.Contrast(img)
img_contrast = enhancer.enhance(2.0) # 2 kat kontrast
img_contrast.save('ornek_kontrast.jpg')
print("Resmin kontrastı artırıldı ve kaydedildi.")
[b]Renk doygunluğunu azaltalım (neredeyse gri tonlama gibi)[/b]
enhancer = ImageEnhance.Color(img)
img_desaturated = enhancer.enhance(0.3) # %30 renk doygunluğu
img_desaturated.save('ornek_doygunluk_azaltildi.jpg')
print("Resmin renk doygunluğu azaltıldı ve kaydedildi.")
Resme Dokunuşlar: Metin ve Şekil Çizimi
Resimlerin üzerine metin veya geometrik şekiller çizmek de sıkça karşılaşılan bir ihtiyaçtır, özellikle filigran ekleme, kartvizit oluşturma veya basit grafikler çizme gibi durumlarda. Pillow'da bu iş için ImageDraw modülü kullanılır. Ayrıca, metin çizerken fontları yüklemek için ImageFont modülüne ihtiyacımız olacak.
CODE
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
from PIL import Image, ImageDraw, ImageFont
try:
img = Image.open('ornek.jpg').convert('RGB') # Metin eklemek için RGB modunda olmalı
except FileNotFoundError:
print("ornek.jpg dosyası bulunamadı.")
exit()
draw = ImageDraw.Draw(img) # Çizim nesnesini oluşturuyoruz
[b]Bir font yükleyelim (sisteminizde Arial veya benzeri bir .ttf dosyası olmalı)[/b]
try:
font = ImageFont.truetype("arial.ttf", 36) # Font dosyasının yolu ve boyutu
except IOError:
# Eğer Arial.ttf bulunamazsa, Pillow'un varsayılan fontunu kullanabiliriz
# Veya daha basit bir font deneyebiliriz, örneğin "DejaVuSans.ttf" veya "FreeMono.ttf"
print("Arial.ttf bulunamadı, varsayılan font kullanılacak.")
font = ImageFont.load_default()
# Eğer font boyutu ayarlanmayacaksa, load_default() yeterli.
# Ancak burada boyut ayarlamak için font.size özelliğini doğrudan etkileyemeyiz.
# Gerçek projelerde genellikle bir .ttf dosyası kullanılır.
# Şimdilik varsayılan font boyutuyla devam edelim, metin küçük çıkabilir.
# Alternatif olarak: font = ImageFont.truetype("Pillow/Tests/fonts/FreeMono.ttf", 36)
# Bu yol, Pillow kütüphanesinin test klasöründeki bir fontu işaret eder.
# Gerçek kullanımda kendi font dosyalarınızı kullanın.
[b]Resmin üzerine metin yazalım[/b]
metin = "Python Pillow"
renk = (255, 255, 255) # Beyaz renk
draw.text((10, 10), metin, fill=renk, font=font) # (x, y) koordinatı, metin, renk, font
print("Resme metin eklendi.")
[b]Bir dikdörtgen çizelim[/b]
draw.rectangle((50, 50, 150, 100), fill=(255, 0, 0), outline=(0, 0, 0)) # (sol, üst, sağ, alt)
print("Resme dikdörtgen eklendi.")
[b]Bir daire çizelim (elips olarak)[/b]
draw.ellipse((200, 50, 300, 150), fill=(0, 255, 0), outline=(0, 0, 0))
print("Resme daire eklendi.")
[b]Bir çizgi çizelim[/b]
draw.line((0, 0, img.size[0], img.size[1]), fill=(0, 0, 255), width=5) # (x1, y1, x2, y2)
print("Resme çizgi eklendi.")
img.save('ornek_cizimler.png')
print("Çizimler içeren resim 'ornek_cizimler.png' olarak kaydedildi.")
Pillow ile Pratik Uygulamalar ve İpuçları
Pillow'u kullanarak yapabileceğiniz şeyler gerçekten çok fazla. İşte günlük hayatta veya projelerde sıkça karşınıza çıkabilecek birkaç pratik uygulama fikri:
[list]