操作圖像像素 現在你可以對單獨的像素進行處理了。通過使用 android.graphics.Bitmap API中的getPixels,可以加載像素到一個整數數組中。在本文例子中,你将按照一定規則對每一個像素實作着色。經過這個處理後,所有的像素将被轉化為一個範圍在0到255的位元組碼。android.graphics.Bitmap API中的setPixels則用來加載這個整數數組到一個圖像中。最後一步是通過ImageView變量mIV來更新 螢幕 。以下是實作這個染色過程的代碼片段。 1 private void TintThePicture(int deg) {
2 int[] pix = new int[picw * pich];
3 mBitmap.getPixels(pix, 0, picw, 0, 0 , picw, pich);
4
5 int RY, GY, BY, RYY, GYY, BYY, R, G, B, Y;
6 double angle = (3.14159d * (double)deg) / 180.0d ;
7 int S = (int)(256.0d * Math.sin(angle));
8 int C = (int)(256.0d * Math.cos(angle));
9
10 for (int y = 0; y < pich; y++ )
11 for (int x = 0; x < picw; x++ )
12 {
13 int index = y * picw + x;
14 int r = (pix[index] >> 16) & 0xff ;
15 int g = (pix[index] >> 8) & 0xff ;
16 int b = pix[index] & 0xff ;
17 RY = ( 70 * r - 59 * g - 11 * b) / 100 ;
18 GY = (-30 * r + 41 * g - 11 * b) / 100 ;
19 BY = (-30 * r - 59 * g + 89 * b) / 100 ;
20 Y = ( 30 * r + 59 * g + 11 * b) / 100 ;
21 RYY = (S * BY + C * RY) / 256 ;
22 BYY = (C * BY - S * RY) / 256 ;
23 GYY = (-51 * RYY - 19 * BYY) / 100 ;
24 R = Y + RYY;
25 R = (R < 0) ? 0 : ((R > 255) ? 255 : R);
26 G = Y + GYY;
27 G = (G < 0) ? 0 : ((G > 255) ? 255 : G);
28 B = Y + BYY;
29 B = (B < 0) ? 0 : ((B > 255) ? 255 : B);
30 pix[index] = 0xff000000 | (R << 16) | (G << 8) | B;
31 }
32
33 Bitmap bm = Bitmap.createBitmap(picw, pich, false );
34 bm.setPixels(pix, 0, picw, 0, 0 , picw, pich);
35
36 // Put the updated bitmap into the main view
37 mIV.setImageBitmap(bm);
38 mIV.invalidate();
39
40 mBitmap = bm;
41 pix = null ;
42 }
實作使用者互動操作 看完上面的内容後,我們已經知道了如何導入和導出一個圖像檔案,并且為它建立一個視圖,進而在這個圖檔中處理每一個像素。下面我們要了解的一件事情是實作一個簡單的使用者互動,這樣可以根據使用者端的輸入來實作相應操作。android.view.KeyEvent中的API讓你可以處理響應操作。這個 軟體 被設定為等待方向鍵的中央鍵的按鍵事件。當它被按下的時候,它将為這個圖檔以增加20的方式來進行着色,并将結果儲存的一個檔案中。 1 public boolean onKeyDown(int keyCode, KeyEvent event) {
2 if (keyCode == KeyEvent.KEYCODE_DPAD_CENTER) {
3
4 // Perform the tinting operation
5 TintThePicture(20 );
6
7 // Display a short message on screen
8 nm.notifyWithText(56789, "Picture was tinted" ,
9 NotificationManager.LENGTH_SHORT, null );
10
11 // Save the result
12 SaveThePicture();
13
14 return (true );
15 }
16
17 return super .onKeyDown(keyCode, event);
18 } 一點建議 ·如果處理所有像素要花費比較長的事件,你可能會得到一個應用程式不響應的彈出對話框。這種情況下,你應該建立一個子線程,在它中實作複雜的計算過程。這樣可以讓主線程實作無中斷運作。 ·如果這個子線程需要改變主視圖(例如對圖像進行更新),你應該在主線程中使用一個消息句柄來監聽來自子線程的這個消息,并相應的更新視圖。一個子線程不能夠直接修改主線程中的視圖。 ·你可以進行某些改進。舉個例子來說,它可以被修改類從浏覽檔案夾或從一個URL中讀取圖像檔案。通過多線程和消息處理可以實作圖像動畫的處理。