Android系统截屏
来源:互联网 发布:免费手机视频剪辑软件 编辑:程序博客网 时间:2024/05/23 19:36
package com.android.server.policy;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Matrix;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.os.SystemClock;import android.util.DisplayMetrics;import android.view.Display;import android.view.Surface;import android.view.SurfaceControl;import android.view.WindowManager;/** * Created by denghaigui on 2017/9/20. */public class FloatWindowViewBlur { private Display mDisplay; private DisplayMetrics mDisplayMetrics; private WindowManager mWindowManager; private Bitmap mScreenBitmap; private Matrix mDisplayMatrix; public Context mContext; public Context mKeyguardContext; Bitmap newScreenSingleBitmap; Bitmap mKeyguardBitmap; Bitmap newKeyguardSingleBitmap; public FloatWindowViewBlur(Context context) { super(); // TODO Auto-generated constructor stub mContext=context; android.util.Log.d("kingtime","start == "+ SystemClock.currentThreadTimeMillis()); mWindowManager = (WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE); mDisplay = mWindowManager.getDefaultDisplay(); mDisplayMetrics = new DisplayMetrics(); mDisplay.getRealMetrics(mDisplayMetrics); mDisplayMatrix = new Matrix(); float[] dims = {mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels}; float degrees = getDegreesForRotation(mDisplay.getRotation()); boolean requiresRotation = (degrees > 0); if (requiresRotation) { // Get the dimensions of the device in its native orientation mDisplayMatrix.reset(); mDisplayMatrix.preRotate(-degrees); mDisplayMatrix.mapPoints(dims); dims[0] = Math.abs(dims[0]); dims[1] = Math.abs(dims[1]); } android.util.Log.d("kingdis","dims[0] = "+dims[0]+"---dims[1] = "+dims[1]); mScreenBitmap = SurfaceControl.screenshot((int) dims[0], (int) dims[1]); if (requiresRotation) { // Rotate the screenshot to the current orientation Bitmap ss = Bitmap.createBitmap(mDisplayMetrics.widthPixels, mDisplayMetrics.heightPixels, Bitmap.Config.ARGB_8888); Canvas c = new Canvas(ss); c.translate(ss.getWidth() / 2, ss.getHeight() / 2); c.rotate(degrees); c.translate(-dims[0] / 2, -dims[1] / 2); c.drawBitmap(mScreenBitmap, 0, 0, null); c.setBitmap(null); // Recycle the previous bitmap mScreenBitmap.recycle(); mScreenBitmap = ss; } mScreenBitmap.setHasAlpha(false); mScreenBitmap.prepareToDraw(); android.util.Log.d("kingtime","start than == "+SystemClock.currentThreadTimeMillis()); } public FloatWindowViewBlur(Context context,Bitmap bitmap){ mKeyguardBitmap = bitmap; mKeyguardContext = context; } public Drawable getEnhanceBlur(){ if(mScreenBitmap.getWidth()<mScreenBitmap.getHeight()){ newScreenSingleBitmap = Bitmap.createBitmap(mScreenBitmap, 0, 0, mScreenBitmap.getWidth(), mScreenBitmap.getHeight() - 96); }else{ newScreenSingleBitmap = Bitmap.createBitmap(mScreenBitmap, 0, 0, mScreenBitmap.getWidth() - 96, mScreenBitmap.getHeight()); } android.util.Log.d("kingtime","start before blur == "+SystemClock.currentThreadTimeMillis()); Bitmap blurBitmap = Blur.fastblur(mContext, newScreenSingleBitmap, 25); android.util.Log.d("kingtime","start blur== "+SystemClock.currentThreadTimeMillis()); return new BitmapDrawable(mContext.getResources(), blurBitmap); } private float getDegreesForRotation(int value) { switch (value) { case Surface.ROTATION_90: return 360f - 90f; case Surface.ROTATION_180: return 360f - 180f; case Surface.ROTATION_270: return 360f - 270f; } return 0f; } }
Blur.java做图片的模糊处理
package com.android.server.policy;import android.annotation.SuppressLint;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Matrix;import android.graphics.Bitmap.Config;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.os.Build.VERSION;import android.renderscript.Allocation;import android.renderscript.Element;import android.renderscript.RenderScript;import android.renderscript.ScriptIntrinsicBlur;import android.util.Log;public class Blur { private static final String TAG = "Blur"; private static BitmapDrawable mBitmapDraw; public static Drawable getDrawable(){ return mBitmapDraw; } public static void setDrawable(BitmapDrawable bd){ mBitmapDraw = bd; } private static Bitmap small(Bitmap bitmap){ Matrix matrix = new Matrix(); matrix.postScale(0.5f,0.5f); Bitmap resBitmap = Bitmap.createBitmap(bitmap,0,0,bitmap.getWidth(),bitmap.getHeight(),matrix,true); return resBitmap; } @SuppressLint("NewApi") public static Bitmap fastblur(Context context, Bitmap sentBitmap, int radius) { Bitmap small = small(sentBitmap); Bitmap bitmap = small.copy(small.getConfig(), true); if (radius < 1) { return (null); } int w = bitmap.getWidth(); int h = bitmap.getHeight(); int[] pix = new int[w * h]; Log.e("pix", w + " " + h + " " + pix.length); bitmap.getPixels(pix, 0, w, 0, 0, w, h); int wm = w - 1; int hm = h - 1; int wh = w * h; int div = radius + radius + 1; int r[] = new int[wh]; int g[] = new int[wh]; int b[] = new int[wh]; int rsum, gsum, bsum, x, y, i, p, yp, yi, yw; int vmin[] = new int[Math.max(w, h)]; int divsum = (div + 1) >> 1; divsum *= divsum; int dv[] = new int[256 * divsum]; for (i = 0; i < 256 * divsum; i++) { dv[i] = (i / divsum); } yw = yi = 0; int[][] stack = new int[div][3]; int stackpointer; int stackstart; int[] sir; int rbs; int r1 = radius + 1; int routsum, goutsum, boutsum; int rinsum, ginsum, binsum; for (y = 0; y < h; y++) { rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; for (i = -radius; i <= radius; i++) { p = pix[yi + Math.min(wm, Math.max(i, 0))]; sir = stack[i + radius]; sir[0] = (p & 0xff0000) >> 16; sir[1] = (p & 0x00ff00) >> 8; sir[2] = (p & 0x0000ff); rbs = r1 - Math.abs(i); rsum += sir[0] * rbs; gsum += sir[1] * rbs; bsum += sir[2] * rbs; if (i > 0) { rinsum += sir[0]; ginsum += sir[1]; binsum += sir[2]; } else { routsum += sir[0]; goutsum += sir[1]; boutsum += sir[2]; } } stackpointer = radius; for (x = 0; x < w; x++) { r[yi] = dv[rsum]; g[yi] = dv[gsum]; b[yi] = dv[bsum]; rsum -= routsum; gsum -= goutsum; bsum -= boutsum; stackstart = stackpointer - radius + div; sir = stack[stackstart % div]; routsum -= sir[0]; goutsum -= sir[1]; boutsum -= sir[2]; if (y == 0) { vmin[x] = Math.min(x + radius + 1, wm); } p = pix[yw + vmin[x]]; sir[0] = (p & 0xff0000) >> 16; sir[1] = (p & 0x00ff00) >> 8; sir[2] = (p & 0x0000ff); rinsum += sir[0]; ginsum += sir[1]; binsum += sir[2]; rsum += rinsum; gsum += ginsum; bsum += binsum; stackpointer = (stackpointer + 1) % div; sir = stack[(stackpointer) % div]; routsum += sir[0]; goutsum += sir[1]; boutsum += sir[2]; rinsum -= sir[0]; ginsum -= sir[1]; binsum -= sir[2]; yi++; } yw += w; } for (x = 0; x < w; x++) { rinsum = ginsum = binsum = routsum = goutsum = boutsum = rsum = gsum = bsum = 0; yp = -radius * w; for (i = -radius; i <= radius; i++) { yi = Math.max(0, yp) + x; sir = stack[i + radius]; sir[0] = r[yi]; sir[1] = g[yi]; sir[2] = b[yi]; rbs = r1 - Math.abs(i); rsum += r[yi] * rbs; gsum += g[yi] * rbs; bsum += b[yi] * rbs; if (i > 0) { rinsum += sir[0]; ginsum += sir[1]; binsum += sir[2]; } else { routsum += sir[0]; goutsum += sir[1]; boutsum += sir[2]; } if (i < hm) { yp += w; } } yi = x; stackpointer = radius; for (y = 0; y < h; y++) { // Preserve alpha channel: ( 0xff000000 & pix[yi] ) pix[yi] = (0xff000000 & pix[yi]) | (dv[rsum] << 16) | (dv[gsum] << 8) | dv[bsum]; rsum -= routsum; gsum -= goutsum; bsum -= boutsum; stackstart = stackpointer - radius + div; sir = stack[stackstart % div]; routsum -= sir[0]; goutsum -= sir[1]; boutsum -= sir[2]; if (x == 0) { vmin[y] = Math.min(y + r1, hm) * w; } p = x + vmin[y]; sir[0] = r[p]; sir[1] = g[p]; sir[2] = b[p]; rinsum += sir[0]; ginsum += sir[1]; binsum += sir[2]; rsum += rinsum; gsum += ginsum; bsum += binsum; stackpointer = (stackpointer + 1) % div; sir = stack[stackpointer]; routsum += sir[0]; goutsum += sir[1]; boutsum += sir[2]; rinsum -= sir[0]; ginsum -= sir[1]; binsum -= sir[2]; yi += w; } } Log.e("pix", w + " " + h + " " + pix.length); bitmap.setPixels(pix, 0, w, 0, 0, w, h); return (bitmap); }}
阅读全文
0 0
- Android系统截屏
- android系统截屏接口
- 一个Android系统截屏问题
- Android系统截屏功能提取
- Android系统截屏功能提取
- Android系统截屏功能提取
- Android系统截屏功能提取
- Android系统截屏功能提取
- Android系统截屏的实现分析
- Android系统截屏功能提取
- 去除android系统截屏接口
- Android系统横屏
- android 取消系统锁屏
- android 取消系统锁屏
- Android系统横竖屏修改
- [Android]强制系统横屏
- Android禁止系统锁屏
- Android 截屏——系统截屏方法分析
- 在wrod中输入公式
- faststone capture
- C++ Primer学习笔记(一)基本语言
- transient的作用及使用方法
- Java读取文件并返回字节数组
- Android系统截屏
- 频道管理
- fastboot烧写命令
- apicolud 中touch事件没有效果相关
- 1、算法导论笔记
- 机器学习术语
- 投名状深度好文
- 深入理解JVM--JVM垃圾回收机制
- delphi formatdatetime 毫秒