现在的位置: 首页 > 综合 > 正文

android4.0截屏处理

2013年12月02日 ⁄ 综合 ⁄ 共 2179字 ⁄ 字号 评论关闭

截取屏幕的工作原理

            读缓冲区--》生成可压缩位图--》压缩位图--》生成PNG格式文件

截屏的开源项目地址:http://code.google.com/p/android-fb2png/source/checkout

 

代码备忘

	public void acquireScreenshot(Context mContext) {
		DisplayMetrics metrics = new DisplayMetrics();
		WindowManager WM = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE);
		Display display = WM.getDefaultDisplay();
		display.getMetrics(metrics);
		int height = metrics.heightPixels; // 屏幕高
		int width = metrics.widthPixels; // 屏幕的宽
		int pixelformat = display.getPixelFormat();
		PixelFormat localPixelFormat1 = new PixelFormat();
		PixelFormat.getPixelFormatInfo(pixelformat, localPixelFormat1);
		int deepth = localPixelFormat1.bytesPerPixel;// 位深

		byte[] arrayOfByte = new byte[height* width* deepth];
		long tmp = System.currentTimeMillis();
		try {
			InputStream localInputStream = readAsRoot(new File(
					"/dev/graphics/fb0"));
			DataInputStream localDataInputStream = new DataInputStream(
					localInputStream);
			android.util.Log.e("mytest", "-----read start-------");
			localDataInputStream.readFully(arrayOfByte);
			android.util.Log.e("mytest", "-----read end-------time = "  + (System.currentTimeMillis() -tmp ));
			localInputStream.close();

			FileOutputStream out = new FileOutputStream(new File(
					"/mnt/sdcard/1.png"));
			int[] tmpColor = new int[width * height];
			int r, g, b;
			tmp = System.currentTimeMillis();
			android.util.Log.e("mytest", "-----bitmap start-------");
			for (int j = 0; j < width * height * deepth; j+=deepth) {
					b = arrayOfByte[j]&0xff;
					g = arrayOfByte[j+1]&0xff;
					r = arrayOfByte[j+2]&0xff;
					tmpColor[j/deepth] = (r << 16) | (g << 8) | b |(0xff000000);
			}
			Bitmap tmpMap = Bitmap.createBitmap(tmpColor, width, height,
					Bitmap.Config.ARGB_8888);
			android.util.Log.e("mytest", "-----bitmap end-------time = "  + (System.currentTimeMillis() -tmp ));

			tmp = System.currentTimeMillis();
			android.util.Log.e("mytest", "-----compress start-------");
			tmpMap.compress(Bitmap.CompressFormat.PNG, 100, out);
			android.util.Log.e("mytest", "-----compress end-------time = "  + (System.currentTimeMillis() -tmp ));
			out.close();

		} catch (Exception e) {
			android.util.Log.e("mytest", "Exception");
			e.printStackTrace();
		}

	}

	public static InputStream readAsRoot(File paramFile) throws Exception {
		Process localProcess = Runtime.getRuntime().exec("su");
		String str = "cat " + paramFile.getAbsolutePath() + "\n";
		localProcess.getOutputStream().write(str.getBytes());
		return localProcess.getInputStream();
	}

 

 

抱歉!评论已关闭.