android 高斯模糊处理的简单使用
来源:互联网 发布:u盘启动安装ubuntu系统 编辑:程序博客网 时间:2024/04/29 11:33
<span style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;">android 高斯模糊处理的简单使用</span><br style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;" /><br style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;" /><span style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;">先是按比例压缩,然后质量压缩 然后模糊处理,然后非空判断一直用 activity结束的时候recycle一下</span><br style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;" /><br style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;" /><span style="color: rgb(34, 34, 34); font-family: 'Helvetica Neue', 'Hiragino Sans GB', 'Microsoft YaHei', 黑体, Arial, sans-serif; font-size: 14px; line-height: 22.3999996185303px;">测试机,三星note3,新鲜出炉,还没测试低端机</span>
@Override protected void onScrollChanged(int l, int t, int oldl, int oldt) { super.onScrollChanged(l, t, oldl, oldt); if (mTopView != null && mFlowView != null && mImageView != null && mHover != null) { if (bitmap == null || bitmap.isRecycled()) { drawable = (BitmapDrawable) mImageView.getDrawable(); bitmap = drawable.getBitmap();// 位图质量和大小压缩加高斯算法计算时间取决于手机的硬件,此处使用异步优化图片变化过程的卡顿现象// bitmap = blurBitmap(bitmap);// drawable = new BitmapDrawable(bitmap); new task().execute(bitmap); } if (t >= mTopView.getHeight()) { mFlowView.setVisibility(View.VISIBLE); } else { mFlowView.setVisibility(View.GONE); if (t == 0) { mHover.setVisibility(View.INVISIBLE); mImageView.setAlpha(1f); } else { mHover.setBackground(drawable); mHover.setVisibility(View.VISIBLE); mImageView.setAlpha(0x1.ccccccp-1f);//透明度.9f 编译器可选转换到16禁止,方便编译计算 } } } } class task extends AsyncTask<Bitmap, Void, Bitmap> { @Override protected Bitmap doInBackground(Bitmap... params) { bitmap = drawable.getBitmap(); bitmap = blurBitmap(bitmap); return bitmap; } @Override protected void onPostExecute(Bitmap bitmap) { super.onPostExecute(bitmap); if (bitmap != null) drawable = new BitmapDrawable(bitmap); mHover.setBackground(drawable); } } public void listenerFlowViewScrollState(View topView, View flowView, ImageView imgView, View hover) { mTopView = topView; mFlowView = flowView; mImageView = imgView; mHover = hover; } public Bitmap blurBitmap(Bitmap bitmap) { //压缩到100k以下,大图片理论上只能压缩到尽量靠近100k bitmap = comp(bitmap); //下面是google源码, radius代表能压缩的最大模糊程度 //Let's create an empty bitmap with the same size of the bitmap we want to blur Bitmap outBitmap = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Bitmap.Config.ARGB_8888); //Instantiate a new Renderscript RenderScript rs = RenderScript.create(mContext); //Create an Intrinsic Blur Script using the Renderscript ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs)); //Create the Allocations (in/out) with the Renderscript and the in/out bitmaps Allocation allIn = Allocation.createFromBitmap(rs, bitmap); Allocation allOut = Allocation.createFromBitmap(rs, outBitmap); //Set the radius of the blur blurScript.setRadius(25.f); //Perform the Renderscript blurScript.setInput(allIn); blurScript.forEach(allOut); //Copy the final bitmap created by the out Allocation to the outBitmap allOut.copyTo(outBitmap); //recycle the original bitmap bitmap.recycle(); //After finishing everything, we destroy the Renderscript. rs.destroy(); return outBitmap; } private Bitmap comp(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 100, baos); if (baos.toByteArray().length / 1024 > 1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出 baos.reset();//重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray()); BitmapFactory.Options newOpts = new BitmapFactory.Options(); //开始读入图片,此时把options.inJustDecodeBounds 设回true了 newOpts.inJustDecodeBounds = true; Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts); newOpts.inJustDecodeBounds = false; int w = newOpts.outWidth; int h = newOpts.outHeight; //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为 float hh = 800f;//这里设置高度为800f float ww = 480f;//这里设置宽度为480f //缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可 int be = 1;//be=1表示不缩放 if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放 be = (int) (newOpts.outWidth / ww); } else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放 be = (int) (newOpts.outHeight / hh); } if (be <= 0) be = 1; newOpts.inSampleSize = be;//设置缩放比例 //重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了 isBm = new ByteArrayInputStream(baos.toByteArray()); bitmap = BitmapFactory.decodeStream(isBm, null, newOpts); return compressImage(bitmap);//压缩好比例大小后再进行质量压缩 } private Bitmap compressImage(Bitmap image) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); image.compress(Bitmap.CompressFormat.JPEG, 90, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中 int options = 90; while (baos.toByteArray().length / 1024 > 100) { //循环判断如果压缩后图片是否大于100kb,大于继续压缩 baos.reset();//重置baos即清空baos image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中 options -= 10;//每次都减少10 } ByteArrayInputStream isBm = new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中 Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片 return bitmap; }
0 0
- android 高斯模糊处理的简单使用
- android高斯模糊的简单实现
- Android 图片高斯模糊处理
- android 图片高斯模糊处理方法
- Android 图片高斯模糊处理
- Android 图片高斯模糊处理
- Android图片高斯模糊处理应用-涉及libjpeg的使用,NDK对SurfaceView的操作,图像模糊处理,附源代码
- 高斯模糊处理
- 图像处理平滑处理--高斯滤波,简单模糊,中值模糊,双边滤波,简单无放缩变换
- 高斯模糊算法的简单解释
- 高斯模糊的简单算法
- 高斯模糊效果的简单实现
- 高斯模糊效果的简单实现
- Android简单、高性能的高斯模糊(毛玻璃)效果(附源码)
- Android简单、高性能的高斯模糊(毛玻璃)效果(附源码)
- android 高斯模糊
- android高斯模糊
- Android高斯模糊
- 验证: 默认情况下, const变量仅在当前文件范围内有效
- 什么是框架简单的说
- 判断两个圆是否重叠
- 【codvs3304 3305 3306】水果姐逛水果街系列【线段树】【树链剖分】
- CodeForces 173C Spiral Maximum dp 矩阵降次
- android 高斯模糊处理的简单使用
- C中的递归问题
- UVa 11039 - Building designing
- ThreadLocal解析
- 最适合物联网开发的程序语言曝光
- Java排序算法(一):冒泡排序
- 自己写的C++高精度模板(带运算符重载),与别人的对比
- C语言 提取网站域名
- iOS中如何监测来电