操作图像像素
现在你可以对单独的像素进行处理了。通过使用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 }
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 }
图2:按下中间按钮时的结果
实现用户交互操作
看完上面的内容后,我们已经知道了如何导入和导出一个图像文件,并且为它创建一个视图,进而在这个图片中处理每一个像素。下面我们要了解的一件事情是实现一个简单的用户交互,这样可以根据用户端的输入来实现相应操作。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 }
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中读取图像文件。通过多线程和消息处理可以实现图像动画的处理。
结束语
希望这篇文章能让朋友们对Android平台的工作方式有一个粗略的了解。希望朋友在这个平台上早日创建出自己的应用。