"CCanvas Sınıfını incelemek. Şeffaf Nesneler Nasıl Çizilir" makalesi için tartışma - sayfa 6

 
Nikolai Semko:

Bu, Peter, çok kolay.

İşte size sorunun özüne hakim olmanız ve pekiştirmeniz için bir görev:

- ARGB(a1,r1,g1,b1) ve ARGB(a2,r2,g2,b2) renklerini, her biri kendi a1 ve a2 saydamlığına sahip tek bir katman içinde nasıl karıştırabilirim?

Bu harmanlama olmadan, kenarları yumuşatılmış nesneleri düzgün bir şekilde üst üste bindirmek imkansızdır.

Hızlı bir bakışta: İlk katman renginin üzerine makalede açıklanan yöntemi kullanarak ilk ARGB(a1,r1,g1,b1) 'yi bindiriyoruz. Ardından, ilk rengin üzerine, aynı formüle göre ARGB hesaplamaları yaparak ikincisini uyguluyoruz. Sadece bu sefer, en alttaki renk, orijinal katman renginin üzerine koyduğumuz ilk renk olacak.

Yanılıyor olabilirim Nikolai, ama neden işe yaramasın?

ZY. Henüz deneme yapmadım, ancak ilk seçenek işe yaramayabilir çünkü iki üst katmanın son şeffaflığı yanlış hesaplanır. Bu durumda, orta katmanı üst katmanla karıştırmanız ve ortak renklerini elde ettikten sonra orijinal katmanın üzerine yerleştirmeniz gerekir.

 
Реter Konow:

Hızlı bir bakışta: İlk katman renginin üzerine makalede açıklanan yöntemi kullanarak ilk ARGB(a1,r1,g1,b1) 'yi bindiriyoruz. Ardından, ilk rengin üzerine aynı formüle göre ARGB hesaplamaları yaparak ikinci rengi uyguluyoruz. Bu kez alttaki renk, ilk katman renginin üzerine koyduğumuz ilk renk olacaktır.

Belki yanılıyorum Nikolai, ama neden işe yaramasın ki?

ZY. Henüz deneme yapmadım ama ilk seçenek işe yaramayabilir çünkü iki üst katmanın son saydamlığı yanlış hesaplanır. Bu durumda, orta katmanı üst katmanla karıştırmanız ve ortak renklerini elde ettikten sonra orijinal katmanın üzerine bindirmeniz gerekir.

Bu aslında kolay bir iş değildir.
Ancak kim bunu kendi başına çözebilirse, haklı olarak bir renk gurusu olarak kabul edilebilir.
Bu makale, tam da bu formülün yokluğu nedeniyle akademik olmaktan uzaktır.
 
Nikolai Semko:
Aslında bu bir meydan okuma. Kolay bir meydan okuma değil.
Ama kim bunu kendi başına çözebilirse, haklı olarak bir renk gurusu olarak kabul edilebilir.

Nasıl? Kendiniz denediniz mi? Muhtemelen üst rengi bir filtre olarak kullanın, alt katmanın her bir bileşenini (rgb) üst katmanın ilgili bileşeninin seviyesine ve şeffaflığa (alttan üstten ne kadar geçeceği belirlenir) orantılı olarak hesaplayın. Daha sonra üstteki bileşenlerin seviyelerini opaklığa (üstten ne kadar kalacağı belirlenir) göre yeniden hesaplayın. Sonunda, alt ve üst katmanların her bir bileşeninin ortalamasını hesaplayın (orijinal alt ve üst değil, yazıldığı gibi yeniden hesaplananlar). Ben denemedim.

Ya da sadece bileşenleri saydamlıkla orantılı olarak toplayın.

Denemem gerekecek... ilginç bir görev.

 
Dmitry Fedoseev:

Nasıl? Bunu kendiniz denediniz mi?

Bu sorunu dört yıl önce çözmüştüm ama çok fazla beyin fırtınası yaparak.
Çok fazla beyin aktivitesi görürsem ve kimse çözümü bulamazsa çözümü yayınlayacağım.
 

Uffff... Her şeyin çok daha basit olduğu ortaya çıktı, istiflemeden önce filtrelemeye gerek yok. Bileşenler basitçe şeffaflık ve opaklıkla orantılı olarak eklenir:

r=lr*(255-Alpha)/255+ur*Alpha/255;
g=lg*(255-Alpha)/255+ug*Alpha/255;
b=lb*(255-Alpha)/255+ub*Alpha/255;

Alfa: 255 - üst katman opak, 0 - tamamen şeffaf.

lr, lg, lb - alt katmanın bileşenleri.

ur, ug, ub - üst katmanın bileşenleri.

Burada terminalde, siyah arka plan, kırmızı kare opak, üzerinde %50 şeffaflık ile mavi ve sonra %50 şeffaflık ile sarı.

İşte photoshop'ta da aynı şey:


 
Dmitry Fedoseev:

Uffff... Her şeyin çok daha basit olduğu ortaya çıktı, istiflemeden önce filtrelemeye gerek yok. Bileşenler basitçe şeffaflık ve opaklıkla orantılı olarak eklenir:

Alfa: 255 - üst katman opaktır, 0 - tamamen saydamdır.

lr, lg, lb - alt katmanın bileşenleri.

ur, ug, ub - üst katmanın bileşenleri.

Bilgisayarımın başına geçtiğimde, bu formülü kullanarak iki saydam görüntüyü karıştırmayı deneyeceğim ve ne olacağını göreceğim. :))
 
Nikolai Semko:
Bilgisayarıma gideceğim, bu formülü kullanarak iki şeffaf resmi karıştırmayı deneyeceğim ve ne olacağını göreceğim. :))

İki saydam resmi nasıl karıştırıyorsunuz? Birincisi arka planın üzerine bindirilir, sonra ikincisi sonucun üzerine bindirilir.

Genel olarak, iki saydamı bir şekilde katlayabilir ve ardından arka planın üzerine bindirebilirsiniz, ancak şimdi bununla ilgili değil.

***

Photoshop'ta olduğu gibi katmanları üst üste bindirmenin tüm yöntemlerini öğrenmek özellikle ilginç olurdu.

 
Dmitry Fedoseev:

Uffff... Her şeyin çok daha basit olduğu ortaya çıktı, istiflemeden önce filtrelemeye gerek yok. Bileşenler basitçe şeffaflık ve opaklıkla orantılı olarak eklenir:

r=lr*(255-Alpha)/255+ur*Alpha/255;
g=lg*(255-Alpha)/255+ug*Alpha/255;
b=lb*(255-Alpha)/255+ub*Alpha/255;

Alfa: 255 - üst katman opaktır, 0 - tamamen saydamdır.

lr, lg, lb - alt katmanın bileşenleri.

ur, ug, ub - üst katmanın bileşenleri.

Burada terminalde, siyah arka plan, kırmızı kare opak, üzerinde %50 saydamlıkta mavi ve ardından %50 saydamlıkta sarı.

İşte aynı şeyin photoshop'taki hali:

o değil ...

Mesele şu ki, Alfa1 ve Alfa2 var.

Bu yüzden sadece yeni oluşan karışım renklerini değil, aynı zamanda yeni oluşan saydamlığı da hesaplamanız gerekir.

Esasen, şeffaf rengi arka planla karıştıran makalenin yazarının formülünü tekrarladınız:

result=backgraund*(1-alpha)+foreground

ve sizde de var:

result=backgraund*(1-alpha)+foreground*alpha

Varyantınız doğru, ancak makalenin yazarı basit bir formülde hata yaptı ve Peter'ın bu formül için ona teşekkür etmesi komik :))))

Sonuçta, yazarın formülünde uchar taşmasının kolayca oluştuğunu çıplak gözle görebilirsiniz. Bu büyük hatayı 4 yıldır kimsenin görmemiş olması gariptir.

 

diğer şeffaf renkleri karıştırma algoritmasının uygulandığı yerdir:


 
Neden iki şeffaf katmanı karıştırıp sonra uygulayasınız? Önce bir katmanı, sonra diğerini uygulayın.