/* * Copyright (C) 2011 Baidu.com Inc * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.baidu.cafe.local; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import android.content.Context; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Picture; import android.graphics.drawable.BitmapDrawable; import android.view.View; import android.webkit.WebView; /** * @author yuboyang@baidu.com, luxiaoyu01@baidu.com * @date 2011-1-14 * @version * @todo */ class SnapshotHelper { private static void print(String message) { if (Log.IS_DEBUG && message != null) { Log.i("SnapshotHelper", message); } } private static void outputToFile(String savePath, Bitmap bitmap) { print("savePath:" + savePath); FileOutputStream fos = null; try { fos = LocalLib.mInstrumentation.getTargetContext().openFileOutput(savePath, Context.MODE_WORLD_READABLE); if (fos != null) { bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos); fos.close(); } } catch (Exception e) { e.printStackTrace(); } finally { if (fos != null) { try { fos.close(); } catch (Exception e) { e.printStackTrace(); } } // FileUtils.setPermissions(savePath, FileUtils.S_IRWXU | FileUtils.S_IRWXG // | FileUtils.S_IRWXO, -1, -1); } } /** * Take a whole snapshot of a WebView. * * @param webView * target webview * @param savePath * e.g. /sdcard/webview.jpg */ public static void takeWebViewSnapshot(WebView webView, String savePath) { Picture picture = webView.capturePicture(); Bitmap bmp = Bitmap.createBitmap(picture.getWidth(), picture.getHeight(), Bitmap.Config.RGB_565); Canvas c = new Canvas(bmp); picture.draw(c); outputToFile(savePath, bmp); } public static void dumpPic(WebView view, String filename) { Picture picture = view.capturePicture(); print("[picture]width: " + picture.getWidth() + ", height:" + picture.getHeight() + "| [view]width:" + view.getWidth() + ", contentheight:" + view.getContentHeight()); if (picture.getWidth() == 0 || picture.getHeight() == 0) { print("something error!"); return; } int width, height; // if (Build.VERSION.SDK_INT < 17) { float i = view.getScale(); print("scale: " + i); width = (int) (picture.getWidth() * i); height = (int) (picture.getHeight() * i); // } else { // float sx = view.getScaleX(); // float sy = view.getScaleY(); // print("scaleX: " + sx + "scaleY: " + sy); // width = (int) (picture.getWidth() * sx); // height = (int) (picture.getHeight() * sy); // } Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(bitmap); //picture.draw( c ); //c.drawPicture(picture); view.draw(c); outputToFile(filename, bitmap); } /** * Take a Snapshot of a View * * @param view * Target view * @param savePath * Image Path */ static public void takeViewSnapshot(final View view, final String savePath) { if (null == view) { print("null == view at takeViewSnapshot"); return; } view.setDrawingCacheEnabled(true); view.buildDrawingCache(); Bitmap bitmap = view.getDrawingCache(); if (null == bitmap) { print("null == bitmap at takeViewSnapshot"); return; } if (LocalLib.mTheLastClick[0] != -1 && LocalLib.mTheLastClick[1] != -1) { bitmap = pressPointer(bitmap, LocalLib.mTheLastClick[0], LocalLib.mTheLastClick[1]); LocalLib.mTheLastClick[0] = -1; LocalLib.mTheLastClick[1] = -1; } outputToFile(savePath, bitmap); view.destroyDrawingCache(); } /** * Take a Snapshot, default image is 320x480 * * @param savePath */ static public void takeScreenshot(String savePath) { takeScreenshot(savePath, 320, 480); } static public void takeScreenshot(String savePath, int screenWidth, int screenHeight) { savePath += ".jpg"; print(savePath + " " + screenWidth + " " + screenHeight); File fileSrc = null; FileInputStream in = null; try { fileSrc = new File("/dev/graphics/fb0"); in = new FileInputStream(fileSrc); } catch (FileNotFoundException e) { e.printStackTrace(); } byte buffer[] = new byte[1000000]; if (in == null) { return; } try { in.read(buffer); } catch (IOException e) { e.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e) { e.printStackTrace(); } } } int[] colors = new int[500000]; int r = 0, g = 0, b = 0; int ii = 0; for (int i = 0; i < screenWidth * screenHeight; i++) { ii = i * 2; r = (buffer[ii + 1] & 0xf8) << 16; g = (((buffer[ii + 1] & 0x7) << 3) | ((buffer[ii] & 0xe0) >> 5)) << 10; b = (buffer[ii] & 0x1f) << 3; colors[i] = r | g | b; } Bitmap bitmap = Bitmap.createBitmap(colors, screenWidth, screenHeight, Bitmap.Config.RGB_565); outputToFile(savePath, bitmap); } /** * press a pointer on a image * * @param canvas * @param small * @param x * @param y * @param alpha * @return */ public static Bitmap pressPointer(Bitmap bitmap, int x, int y) { try { String pngPath = LocalLib.mInstrumentation.getTargetContext().getFilesDir().toString() + "/pointer.png"; InputStream in = new FileInputStream(pngPath); Bitmap pointer = new BitmapDrawable(in).getBitmap(); Canvas canvas = new Canvas(bitmap); int offsetX = 21; int offsetY = 21; canvas.drawBitmap(pointer, x - offsetX, y - offsetY, null); return bitmap; } catch (IOException e) { e.printStackTrace(); } return null; } }