5.7. Görüntüleri birleştirme¶
Önceki sayfadaki çizim ilkelleri bir görüntünün üzerine geometrik işaretler boyar – bir çizgi, bir dikdörtgen, bir metin parçası. Bu, bir algoritmanın görünür kılması gereken açıklamaların çoğunu kapsar, ancak hepsini değil. Bazen açıklamanın kendisi bir görüntüdür: geçerli çerçevenin yanında yan yana gösterilecek yakalanmış bir referans çerçevesi, önizlemenin bir köşesinde gösterilen önceki bir yakalamanın küçük resmi, kalibrasyon için canlı bir çerçevenin üzerinde görselleştirilen, önceden depolanmış bir şablon. Bir görüntüyü başka bir görüntünün üzerine çizme mekanizması tek bir yöntemdir – draw_image() – ve gerçek birleştirmenin ihtiyaç duyduğu konum, ölçekleme, renk paleti ve saydamlığı işleyecek kadar parametreye sahiptir.
5.7.1. Temel çağrı¶
En basit haliyle draw_image, başka bir Image ve onu çizeceği bir konum alır:
reference = image.Image("/sdcard/reference.bmp")
img.draw_image(reference, x=10, y=10)
Hedef img; kaynak reference; kaynağın sol üst pikseli img görüntüsünün (10, 10) noktasına gelir ve kaynağın geri kalan pikselleri oradan sağa ve aşağıya doğru takip eder. Hedefin, kaynağın kapladığı pikselleri kaynağın karşılık gelen pikselleriyle üzerine yazılır; kaynağın kapsama alanının dışındaki piksellere dokunulmaz.
Kaynak, hedefin kenarının ötesine taşarsa, dışarıda kalan kısımlar sessizce kırpılır – set_pixel öğesinin aralık dışı konumlar için gösterdiği aynı bağışlayıcı davranıştır bu. Uygulama kodunun konumu önceden görüntü boyutlarına sıkıştırması gerekmez; istediği konumu geçirebilir ve kırpma işini yönteme bırakabilir.
5.7.2. Bir dosyayı satır içinde yükleme¶
draw_image, Image argümanının yerine bir dosya yolu kabul eder ve birleştirmeden önce dosyayı yükler:
img.draw_image("/sdcard/reference.bmp", x=10, y=10)
Bu bir kolaylık gibi görünür – iki satır yerine bir satır – ve öyledir de, ama fark söz diziminden öteye geçer. Bir dosyadan Image oluşturmak, çözümlenmiş pikselleri tutmak için bir arabellek ayırır ve bu arabellek, çöp toplama onu serbest bırakana kadar varlığını sürdürür. Yolu doğrudan draw_image öğesine geçirmek, modülün dosyayı geçici bir arabelleğe çözümlemesine, oradan birleştirmesine ve çağrı döndüğünde arabelleği serbest bırakmasına olanak tanır; bunun için uygulama kodunun çerçeveler arasında ayrı bir Image öğesine referans tutması gerekmez.
5.7.3. Ölçekleme¶
Kaynak ile hedef farklı boyutlarda olduğunda – daha yüksek çözünürlüklü bir tuvale birleştirilen düşük çözünürlüklü bir yakalama veya çerçevenin belirli bir kesrine boyutlandırılması gereken bir küçük resim – iki ölçek parametresi, kaynağı çizilirken yeniden boyutlandırma işini halleder:
img.draw_image(reference, x=10, y=10, x_scale=2.0, y_scale=2.0)
x_scale ve y_scale bağımsız ondalık sayılardır; ikisini de aynı değerle geçirmek tekdüze ölçekler, farklı değerler geçirmek ise kaynağı bir eksen boyunca uzatır veya küçültür. Ölçekleme çizim sırasında gerçekleşir; reference kaynağı değiştirilmez.
Bir ipucu bayraklarından oluşan bit maskesi, ölçeklemenin pikseller arasında gerçekte nasıl ara değer hesaplayacağına karar verir. image.BILINEAR daha fazla hesaplama pahasına daha yumuşak sonuçlar üretir; image.BICUBIC daha da yumuşak sonuçlar üretir ve yine daha fazlasına mal olur; varsayılan, en ucuz olan ve kaynak zaten hedefin piksel çözünürlüğünde olduğunda doğru tercih olan en yakın komşu yöntemini kullanır. En-boy işleme bayrakları – SCALE_ASPECT_KEEP, SCALE_ASPECT_EXPAND, SCALE_ASPECT_IGNORE – kaynağın en-boy oranı, içine çizildiği dikdörtgenle eşleşmediğinde ne yapılacağına karar verir.
5.7.4. Alfa harmanlama¶
Varsayılan olarak draw_image, hedef pikselleri kaynak piksellerle değiştirir. Amaç yarı saydam bir bindirme olduğunda – böylece hedef, kaynağın içinden görünür – alpha parametresi ikisinin nasıl karıştırılacağını kontrol eder. alpha=0 yalnızca hedefi gösterir (kaynak yok); alpha=255 varsayılandır ve yalnızca kaynağı gösterir (tam değiştirme); ara değerler ise ikisini orantılı olarak karıştırır:
img.draw_image(overlay, x=0, y=0, alpha=128)
Ayrı bir alpha_palette argümanı, modülün piksel başına tek alfa mekanizmasıdır. Değerleri, kaynaktaki eşleşen konumda alfa olarak kullanılan bir GRAYSCALE görüntüsü alır – örneğin, alfası yoğunluğuna göre değişen bir ısı haritası. Alfanın o ayrı gri tonlama argümanı olarak sağlanması gerekir; kendi alfa kanalını taşıyan bir kaynak görüntü (örneğin saydamlık içeren bir PNG) bunu otomatik olarak getirmez.
5.7.5. Kaynak ROI ve palet¶
İki ek parametre birleştirme mekanizmasını tamamlar:
roi=(x, y, w, h)kaynağı kendisinin bir alt dikdörtgeniyle sınırlar, böylece yalnızca o dikdörtgen hedefe birleştirilir. Kırpılmış bir ara görüntü hazırlamadan, aynı çağrı içinde kırpma yapmak için kullanışlıdır.color_palette, her kaynak pikselinin değerini çizmeden önce bir arama tablosu üzerinden değiştirir –to_rainbow()veto_ironbow()öğelerinin kullandığı aynı mekanizmadır bu; burada açığa çıkarılmıştır, böylece bir bindirme, ayrı bir dönüştürme geçişi olmadan hedefe giderken paletlenebilir.
Her ikisi de çağrıdaki diğer her şeyle birlikte birleşir: ölçekleme, alfa, hedef tarafındaki mask argümanı ve yazma işlemini hedefin bir dikdörtgeniyle kapsamlandıran hedef tarafındaki roi parametresi.