2011-08-08 55 views
0

我有一個像素只包含兩個argb值的位圖:純黑色和純透明。然後,我在Android中縮放位圖,現在位圖有許多argb值:純黑色和純透明和黑色,各種透明度級別(即半透明黑色);這是由於android自動完成的插值。我希望位圖像素只包含原始的兩個argb值。Android:有效確保縮放位圖中的像素只有兩種顏色

目前,我做到這一點有以下過程:

my_bitmap = Bitmap.createScaledBitmap(BitmapFactory 
        .decodeResource(context.getResources(), 
          R.drawable.my_resource), 
            new_width, new height, false); 

for (int i = 0; i < my_bitmap.getWidth(); i++) { 
       for (int j = 0; j < my_bitmap.getWidth(); j++) { 
        if (my_bitmap.getPixel(i, j) != Color.TRANSPARENT) { 
         my_bitmap.setPixel(i, j, Color.BLACK); 
        } 
       } 
     } 

這是因爲即便是一個小位圖便宜的手機上慢極了,沒有人知道如何要麼A)做到這一點更快或B)規模沒有新的argb值出現的位圖?

回答

0

我想這裏的答案是一個算法。

位圖操作非常昂貴......也許您可以將位圖緩存在某處,並且只在特定請求插值時才繪製它?

我的另一個想法是將一些像素數量組合在一起,並且有一個標誌「hasChanged」或類似的東西,並且當某些東西被改變時將其設置爲真,以便系統知道它必須重新繪製該像素組。通過這種方式,你不會比必要的更頻繁地重繪東西。

希望這會有所幫助!

+0

謝謝你,你是對的,但我仍然不明白爲什麼這麼慢。不是一個位圖只是一種多維數組,我可以以某種方式迭代而不調用getPixel和setPixel?也許這會加快速度。 – tjb

+0

是的,但速度很慢,因爲每當位圖的hashCode更改時,屏幕都需要重新繪製位圖。這張圖是昂貴的,而不是內存中的操縱。這就是爲什麼我建議緩存位圖以便每次操作只重繪一次。 – Codeman

+0

我不明白,當這個操作發生時,這個位圖不在屏幕上,我認爲這已經足夠了。我必須採取哪些額外步驟來緩存它? – tjb

0

由於內置算法不符合您的要求,因此要在代碼中進行縮放。你將避免你不想要的插值,你不必撤消它。 (原諒任何編碼錯誤 - 我沒有訪問IDE或編譯器就寫了這個。)

my_bitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.my_resource); 
int[] src = new int[my_bitmap.getWidth() * my_bitmap.getHeight()]; 
my_bitmap.getPixels(src, 0, my_bitmap.getWidth(), 0, 0, my_bitmap.getWidth(), my_bitmap.getHeight()); 
int[] dst = new int[new_width * new_height]; 
float scaleX = my_bitmap.getWidth()/new_width; 
float scaleY = my_bitmap.getHeight()/new_height; 
for (int y = 0; y < new_height; y++) { 
    for (int x = 0; x < new_width; x++) { 
     int srcY = (int) (y * scaleY); 
     int srcX = (int) (x * scaleX); 
     dst[y*new_height + x] = src[srcY*my_bitmap.getHeight() + srcX]; 
    } 
} 
Bitmap newBitmap = Bitmap.createBitmap(dst, 0, new_width, new_width, new_height, Bitmap.Config.ARGB_8888);