2012-09-06 18 views
6

bir bitmap piksellerini işlemek için IntBuffer kullanıyorum, ancak renk sabitleri AARRGGBBise tampon içinde bir değer, AABBGGRR olmalıdır. Biliyorum, Color.argb, Color.a, ... 'yi ters çevirmek için kullanabilirim, ama bence bu mükemmel değil.Bir ARGB renk değerini ABGR'ye dönüştürmek için hızlı algoritma?

Çok sayıda piksel üzerinde işlem yapmam gerekiyor, bu nedenle bu operatörü kısa sürede gerçekleştirebilecek bir algoritmaya ihtiyacım var. Bu Bit İfade düşünüyorum, ama doğru değil: Bir daha iyi yoksa

0xFFFFFFFF^pSourceColor 

, belki biraz kaydırmalı operatörleri (yani ... Color.a gerçekleştirir) yerine azaltma işlevleri çağırmak kullanacak zaman.

DÜZENLEME:

Daha iyi bir algoritma (daha az operatörleri) bunu gerçekleştirmek için orada shoul düşünüyorum ama bu, dönüştürmek için benim şimdiki işlevdir: A ve G olduğundan

private int getBufferedColor(final int pSourceColor) { 
    return 
      ((pSourceColor >> 24) << 24) |   // Alpha 
      ((pSourceColor >> 16) & 0xFF) |   // Red -> Blue 
      ((pSourceColor >> 8) & 0xFF) << 8 |  // Green 
      ((pSourceColor) & 0xFF) << 16;   // Blue -> Red 
} 
+1

olası yinelenen [BGR için RGB dönüştürmek için nasıl?] (Http://stackoverflow.com/questions/3041499/how-to-convert-rgb-to-bgr) –

+0

Hayır, bu konu sadece RGB hakkında tartışmak. Ve iyi cevaplar aslında kırmızı, yeşil, mavi almak için bit vardiyası kullanıyor. Alpha, pozisyon değiştirmediğinden benim problemim daha ilerlemiş. –

+0

1) Bunu bitshifting kullanmadan (performansla) çözmenin bir yolu yoktur ve 2) Bunu yapmanın en iyi yolu bu cevaptır. Durumunuzda, sadece alfa kaydedin, kaydırın ve sonra sonuna kadar ekleyin. –

cevap

8

Yer, muhtemelen B ve R ve sonra onları geri ekleyerek maskeleme biraz daha iyi yapabilirsiniz. % 95 doğru olmak gerektiğini denemedim ama Have not: Bence

private static final int EXCEPT_R_MASK = 0xFF00FFFF; 
private static final int ONLY_R_MASK = ~EXCEPT_R_MASK; 
private static final int EXCEPT_B_MASK = 0xFFFFFF00; 
private static final int ONLY_B_MASK = ~EXCEPT_B_MASK; 

private int getBufferedColor(final int pSourceColor) { 
    int r = (pSourceColor & ONLY_R_MASK) >> 16; 
    int b = pSourceColor & ONLY_B_MASK; 
    return 
     (pSourceColor & EXCEPT_R_MASK & EXCEPT_B_MASK) | (b << 16) | r; 
} 
+0

Teşekkürler. Aradığım şey bu! –

2

aşağıdaki işlevi ARGB renk ve vice- geçerken ABGR rengi dönecek kadar hızlı olduğunu tersi!

int argbToABGR(int argbColor) { 
    int r = (argbColor >> 16) & 0xFF; 
    int b = argbColor & 0xFF; 
    return (argbColor & 0xFF00FF00) | (b << 16) | r; 
} 
ait
İlgili konular