"CCanvas Sınıfını incelemek. Şeffaf Nesneler Nasıl Çizilir" makalesi için tartışma - sayfa 6
Alım-satım fırsatlarını kaçırıyorsunuz:
- Ücretsiz alım-satım uygulamaları
- İşlem kopyalama için 8.000'den fazla sinyal
- Finansal piyasaları keşfetmek için ekonomik haberler
Kayıt
Giriş yap
Gizlilik ve Veri Koruma Politikasını ve MQL5.com Kullanım Şartlarını kabul edersiniz
Hesabınız yoksa, lütfen kaydolun
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.
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.
Aslında bu bir meydan okuma. Kolay bir meydan okuma değil.
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.
Nasıl? Bunu kendiniz denediniz mi?
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 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:
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ı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.
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.
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)+foregroundve sizde de var:
result=backgraund*(1-alpha)+foreground*alphaVaryantı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: