2011-11-23 58 views
1

假設我想創建一個像素值數組以傳入createBitmap方法here。我有三個int值r, g, b在0 - 0xff範圍內。我如何將它們轉換成不透明的像素p如何創建ARGB_8888像素值?

Alpha通道是進入高位字節還是低位字節?

我一派了documentation但它僅規定:

每個像素被存儲在4個字節。每個通道(用於 半透明度的RGB和alpha)都以8位精度(256個可能的 值)進行存儲。此配置非常靈活,並提供最佳的 質量。應儘可能使用它。

那麼,怎麼寫這個方法呢?

int createPixel(int r, int g, int b) 
{ 
    return ? 
} 

回答

6

the docs

所有的
(alpha << 24) | (red << 16) | (green << 8) | blue 
11

它看起來像RGBA pixel format是相當有據可查的,我假定這就是Android的文檔的意思,只是用不同的名稱,以匹配位區域的通道成員的位置:

enter image description here

像這樣的東西應該工作:

int createPixel(int r, int g, int b) { 
    return createPixel(r, g, b, 0xff); 
} 

int createPixel(int r, int g, int b, int a) { 
    return (a<<24) | (r<<16) | (g<<8) | b; 
} 

此外,你可能想使用一個byte我一個int的nstead以避免溢出類型的錯誤,或者只是掩蓋你想要的位:

int createPixel(int r, int g, int b, int a) { 
    return ((a & 0xff) << 24) 
     | ((r & 0xff) << 16) 
     | ((g & 0xff) << 8) 
     | ((b & 0xff)); 
} 

雖然鉗位值[0,255]可能更有意義。

+0

好吧,這就是所謂的* RGBA *和安卓其所謂* * ARGB?你能否將你的答案作爲一個回報聲明,並在上面的方法中加上適當的變化並添加/添加? – vidstige

+0

@vidstige:嗯,是的,文檔非常含糊。我確實假定Android的* ARGB_8888 *是標準的* RGBA *像素格式,重新命名爲匹配位域中的通道成員資格位置。 – maerics

1

首先,你的論點應該是字節,而不是整數,但我想這可能是一個執行問題。

一般來說,你會做這樣的事情

return b | r<<8 | g<<16 | 255<<24; 

假設你的阿爾法是255(不透明)。

+0

謝謝。是的,我只是想避免所有的混淆字節beeing簽名和所有。 – vidstige

+0

是的。只要確保它們是按內容8位整數。 – Phonon

1

這應該工作:

int createPixel(int r, int g, int b) 
{ 
    return 0xff000000 | (r << 16) | (g << 8) | b; 
} 

,或者,如果你想成爲巴洛克:

int createPixel(int r, int g, int b) 
{ 
    return (((((-1 << 8) | r) << 8) | g) << 8) | b; 
}