图像(图片)处理,RenderScript高斯模糊-Android

> RenderScript
Google 官方RenderScript- https://developer.android.com/guide/topics/renderscript/compute
  RenderScript在Android 3.0引入,而一些内置的compute kernel在JELLY_BEAN_MR1中引入,为了在低版本手机中使用这些特性,我们不得不引入renderscript_v8兼容包。Renderscript,这是一个功能强大的图形处理“引擎”。
  RenderScript是Adnroid3.0引进的用来在Android上写高性能代码的一种语言,语法给予C语言的C99标准,他的结构是独立的,所以不需要为不同的CPU或者GPU定制代码代码。
  RenderScript(并行计算技术)是运行在Android系统上的一个高性能密集计算框架。RenderScript主要面向并行数据的计算,当然也可以使串行数据计算的负载受益。RenderScript运行时会在一台设备所有可用处理器上并行工作,比如多核的CPU、GPU或者DSP,这使得你可以专注于算法,而不是任务调度或者负载平衡。RenderScript在应用程序执行图像处理,计算摄影或者计算机视觉等方面都非常有用。 
   RenderScript两个很重要的概念是需要了解的:高性能的计算内核是通过衍生自C99的语言编写的。有专用的Java API用于管理RenderScript的资源生命周期以及控制内核的执行。
RenderScript demo- https://github.com/desaco1989/Fun_Sobel_RenderScript_Filter
RenderScript Demo- https://github.com/CoXier/RenderScript

Android中OpenGL滤镜和RenderScript图片处理- https://www.jianshu.com/p/66d0fcb902ab
Android中滤镜使用OpenGL和RenderScript处理图片- https://github.com/liweiping1314521/RiemannCamera/

Android5.0下毛玻璃(磨砂)效果实现,图片高斯模糊blur- https://blog.csdn.net/ShareUs/article/details/50420491

-- OpenCV库
  OpenCV库来进行滤镜和图片的处理。处理每一帧的图片,OpenGL和RenderScript脚本处理的相当快,它们的运算都是使用GPU去渲染的,而OpenCV的处理速度取决于CPU的执行速度。

-- opencl 和Renderscript总结- https://www.cnblogs.com/zsychanpin/p/7040566.html
  在android上要开发opencl。手机端要有libopencl.so文件(也就是opencl驱动)。可是如今android手机端非常少有这个文件。原因是尽管AMD、Intel、NVIDIA、苹果等支持opencl,可是google好像不太支持opencl。在移动端,google有RenderScript(渲染脚本。也是基于异构计算的思想实现的API,长处是跨平台性好,适合各种android操作系统,可是性能比opencl稍差点)。
因此大部分android手机支持RenderScript,却非常少有支持opencl的。

Android使用Sobel算法提取图片轮廓- https://github.com/zl-leaf/GraphicLib 
--- eclipse的project.properties加上:
renderscript.target=18
renderscript.support.mode=true
--- Studio Gradle 加上:
android{
  defaultConfig{
        renderscriptTargetApi 18
        renderscriptSupportModeEnabled true
  }
}

> 1.RenderScript实现高斯模糊 ScriptIntrinsicBlur类,大致就是将图片实现高斯模糊。
为了防止出现有的机型兼容问题,最好将renderscript-v8.jar
/**
 * 高斯模糊
 * @param bitmap src
 * @param radius the radius of blur ,max is 25
 * @param context
 * @return a blur bitmap
 */
public static Bitmap blurBitmap(Bitmap bitmap, float radius, Context context) {
    //Create renderscript
    RenderScript rs = RenderScript.create(context);
    //Create allocation from Bitmap
    Allocation allocation = Allocation.createFromBitmap(rs, bitmap);
    Type t = allocation.getType();
    //Create allocation with the same type
    Allocation blurredAllocation = Allocation.createTyped(rs, t);
    //Create blur script
    ScriptIntrinsicBlur blurScript = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs));
    //Set blur radius (maximum 25.0)
    blurScript.setRadius(radius);
    //Set input for script
    blurScript.setInput(allocation);
    //Call script for output allocation
    blurScript.forEach(blurredAllocation);
    //Copy script result into bitmap
    blurredAllocation.copyTo(bitmap);
    //Destroy everything to free memory
    allocation.destroy();
    blurredAllocation.destroy();
    blurScript.destroy();
    t.destroy();
    rs.destroy();
    return bitmap;
}
2.Magnifier Image,实现放大镜效果
3.Sketch Image实现素描效果,处理的算法很简单:
  求RGB平均值Avg = (R + G + B) / 3,如果Avg >= 100,则新的颜色值为R=G=B=255;如果Avg < 100,则新的颜色值为R=G=B=0;255就是白色,0就是黑色;至于为什么用100作比较,这是一个经验值吧,设置为128也可以,可以根据效果来调整。

> RenderScript与OpenGL Shader
  using RenderScript for graphical purposes。a graphics library such as OpenGL。
renderscript-v8.jar:android.support.v8.renderscript.Allocation;android.support.v8.renderscript.RenderScript;
  RenderScript是Android平台的一种类C的高性能编程语言,用于3D渲染和处理密集型计算。
  RenderScript高斯模糊,对图像像素点的每一行中的每一点做水平方向的均值滤波操作。对图像数据的处理。在实际应用中RenderScript常常被用作图层的3D或者2D的图形渲染。比如像现在Android中的动态壁纸大部分使用的方法都是使用RS来进行图形的渲染达到的。
  RenderScript在机器上进行第一遍编译,然后在目标设备上进行最后一遍编译(Just-In-TimeCompiling),因而带来更高效的原生二进制代码。这也就是意味着,凡是支持RenderScript的设备都可以运行你的代码。不用管什么架构。
  着色器(Shader)是用来实现图像渲染的 用来代替固定渲染管线的可编辑程序。

  openGL 1.1不支持shader语言,2.0支持;图形变换或者特效有shader language的支持可以大幅提升性能。
  renderscript available on a device, such as multi-core CPUs and GPUs. ,类c脚本引擎,被google收购了。RenderScript is especially useful for applications performing image processing, computational photography, or computer vision.可以写一些耗计算或者渲染3d图形的脚本,它本身也调用底层opengl接口??,因此和上层的java opengles接口功能上有些重复,在android运用的实践中已经证明比java程序的性能要好。一般用来辅助支持现有的java程序,它能和java主程序通信。树叶动态壁纸就是运用renderscript的例子。

-- 使用OpenGL绘图
  Android支持使用OpenGL API的高性能绘图,这是Android可用的最高级的绘图机制,在游戏类对性能要求较高的应用中得到广泛使用。Android 4.3最大的改变,就是支持OpenGL ES 3.0。相比2.0,3.0有更多的缓冲区对象、增加了新的着色语言、增加多纹理支持等等,将为Android游戏带来更出色的视觉体验。
Android高级模糊技术学习- https://blog.csdn.net/zhuawalibai/article/details/80050535
高斯模糊效果实现方案及性能对比- https://blog.csdn.net/huli870715/article/details/39378349
Android StackBlur高斯模糊- https://github.com/kikoso/android-stackblur
Android中滤镜使用OpenGL和RenderScript处理图片- https://github.com/liweiping1314521/RiemannCamera/

> 图像处理:
  RenderScript是Android系统中能高效处理大量计算任务的框架,特别适用一些需要处理图片和加载图片以及计算机视觉的方面应用。RenderScript是Adnroid3.0引进的.Renderscript是用C99(C的一种标准)实现的。轮廓提取算法是Sobel边缘检测。
Android自动手绘,圆你儿时画家梦- https://blog.csdn.net/huachao1001/article/details/51518322

-- 图像处理,图像的矩阵运算;argb, 矩阵,像素点对图片进行修改;图片的色相/饱和度/亮度
ColorMatrix :RGBA~利用自带的方法修改色调,饱和度,亮度来修改图片;矩阵~利用矩阵计算得到新的矩阵修改图片。
像素点~根据原像素点数组,经过计算得到新的像素点数组,再重新绘制图片。
前端Canvas简单的智能抠图功能- https://github.com/monkeyWangs/Matting
 
-- 常见的图像特效处理算法(基于android)- https://www.jianshu.com/p/f2732b426e40
Android使用 argb, 矩阵,像素点对图片进行修改- https://github.com/JackieSCN/HandleImage
public static Bitmap getChangedBitmap(Bitmap resource,
                                          float hue,
                                          float saturation,
                                          float lum){
        Bitmap out = Bitmap.createBitmap(resource.getWidth()
                ,resource.getHeight(), Bitmap.Config.ARGB_8888);
        Canvas canvas = new Canvas(out);
        Paint paint = new Paint();
        paint.setAntiAlias(true);//抗锯齿

        //调整饱和度
        ColorMatrix saturationMatrix = new ColorMatrix();
        saturationMatrix.setSaturation(saturation);

        //调整色相
        ColorMatrix hueMatrix = new ColorMatrix();
        hueMatrix.setRotate(0,hue);//调整红像素的色相
        hueMatrix.setRotate(1,hue);
        hueMatrix.setRotate(2,hue);

        //调整亮度
        ColorMatrix lumMatrix = new ColorMatrix();
        lumMatrix.setScale(lum,lum,lum,1);

        //把色相/饱和度/明度 合并成一个ColorMatrix
        ColorMatrix colorMatrix = new ColorMatrix();
        colorMatrix.postConcat(hueMatrix);
        colorMatrix.postConcat(saturationMatrix);
        colorMatrix.postConcat(lumMatrix);

        paint.setColorFilter(new ColorMatrixColorFilter(colorMatrix));
        canvas.drawBitmap(resource,0,0,paint);
        return out;
}

你可能感兴趣的:(图像(图片)处理,RenderScript高斯模糊-Android)