实现美图秀秀必备的轻量级 Android 滤镜库

   2016-08-30 0
核心提示:本类库可以对ImageView,View Background,Drawable和Bitmap添加风格与设置亮度、对比度。本类库现提供十种风格,具体见下方图示。可以开启动画效果,并设置差值器Interpolator,监听器Listener。对ImageView/View/Drawable可以获取变换风格后的Bitmap。 如果

本类库可以对ImageView,View Background,Drawable和Bitmap添加风格与设置亮度、对比度。本类库现提供十种风格,具体见下方图示。可以开启动画效果,并设置差值器Interpolator,监听器Listener。对ImageView/View/Drawable可以获取变换风格后的Bitmap。

如果只需要操作ImageView,则可以使用StyleImageView类,该类支持通过布局文件设置属性。如果已经使用了自定义ImageView,或需要操作View的Background,或是任意Drawable与Bitmap,则可以使用Styler类。

注:本类库使用ColorFilter实现效果,如果你已经使用了ColorFilter,有可能产生冲突。

Try Sample

欢迎访问 chengdazhi.com/styleimageview 下载样例程序apk或者扫描下方二维码:

实现美图秀秀必备的轻量级 Android 滤镜库

在样例项目中,style_image_view_test module展示了如何通过xml与java操作StyleImageView。 styler_test module展示了如何使用Styler操作一个ImageView。Styler对于View和Drawable的操作类似。有关如何使用Styler操作Bitmap请查看下文使用说明。

Feature

StyleImageView支持如下10种风格,但对比度(Saturation)风格的图片没有给出,因为需要一个输入值。注意你可以在这些风格之上添加亮度和对比度。

风格模式 海滩 房子与船
Original 无风格
Grey Scale 灰度
Invert 反转
RGB to BGR RB通道反转
Sepia 老照片
Black & White 纯黑白
Bright 明亮
Vintage Pinhole 针孔
Kodachrome 柯达
Technicolor 染印

推荐一些组合:

  • Invert 反转 + (150 亮度) + (2.0F 对比度)
  • Sepia 老照片 + (-100 亮度) + (2.0F 对比度)
  • Kodachrome 柯达 + (-75 亮度) + (1.6F 对比度)

可以从示例程序中找到你想要的组合!

使用方式

重要属性

  • Mode 风格模式:你想要实现的风格,包含如下选项:

    1. Saturation 对比度模式
    2. Grey Scale 灰度模式,即常见的黑白照片
    3. Invert 色彩反转
    4. RGB To BGR 将Red与Blue两个颜色通道反转,可理解为另一种色彩翻转
    5. Sepia 老照片
    6. Black And White 硬像,纯黑白,没有灰色
    7. Bright 明亮
    8. Vintage Pinhole 针孔
    9. Kodachrome 柯达
    10. Technicolor 染印
    11. None 无风格,为Mode属性默认值
  • Brightness 亮度:int型,范围[-255,255],取0时没有效果,默认值为0。

  • Contrast 对比度:float型,范围[0, +∞),取1.0时没有效果,默认值1.0。
  • Saturation 饱和度:float型,范围[0, +∞),取1.0时没有效果,默认值1.0。
  • EnableAnimation:是否开启动画,开启时必须给出动画时长(AnimationDuration),可选择给出差值器(Interpolator)。
  • AnimationDuration:动画时长,当关闭动画时会自动重置时长为0。默认值0。

注意:Saturation(饱和度)是单独的一种模式,不可作用于其他模式之上。调用setSaturation()会自动将模式更改。如果在xml中设置了Saturation,而又设置了Mode且不是saturation,就会报错。

库中许多方法提供了文档注释,必要时请参考源码。

StyleImageView使用方式

xml属性

  • style: 枚举类型,默认值为none。
  • brightness:int 整形,默认值为0。
  • contrast:float 浮点型,默认值为1.0。
  • saturation:float 浮点型,默认值为1.0。
  • enable_animation:boolean 布尔型,默认值为false。
  • animation_duration:int 整形(在java中转换为long类型),默认值为0。

注意:如果设置了animation_duration,enable_animation必须设为true,不然会报错。

Java代码

//简单示例StyleImageViewstyleImageView=(StyleImageView)this.findViewById(R.id.image); styleImageView.setMode(Styler.Mode.SEPIA) .setBrightness(50) .setContrast(0.8) .enableAnimation(500L,newlinearInterpolator())//第一个参数是动画时长,第二个差值器可选.setAnimationLisnter(listener)//设置动画监听器,类型为Styler.AnimationListener.updateStyle();//调用updateStyle()更新UI//updateStyle()之前调用的set方法不区分顺序。styleImageView.getMode(); styleImageView.getBrightess(); styleImageView.getContrast(); styleImageView.getSaturation(); styleImageView.isAnimationEnabled(); styleImageView.getAnimationDuration();//获取当前Bitmap,可以指定长宽,否则使用drawable或view的尺寸。styleImageView.getBitmap([intwidth,intheight]);//设置风格,如果参数不是Styler.Mode.SATURATION,但之前设置了saturation,则saturation会被重置为1.0styleImageView.setMode(intStyle.Mode.*); styleImageView.setBrightness(intbrightness); styleImageView.setContrast(floatcontrast);//调用本方法会自动将风格设置为SATURATIONstyleImageView.setSaturation(floatsaturation);//必须传入时长,可选传入差值器。//当设置新的时长时也需要调用本方法。styleImageView.enableAnimation(longduration[,Interpolatorinterpolator]);//关闭动画。会自动重置动画时长和差值器。styleImageView.disableAnimation(); styleImageView.updateStyle();//更新UI//清除所有效果,重置Mode为NONE,重置saturation为1.0,不会重置其他属性。styleImageView.clearStyle();//给动画设置监听器。如果动画处于关闭状态,监听器方法不会执行。//监听器会在动画开始、更新与结束时收到回调。//如果之前设置了监听器,调用本方法会清除原先的监听器。styleImageView.setAnimationListener(Styler.AnimationListenerlistener);//清除AnimationListener并将其返回styleImageView.removeAnimationListener();

Styler使用方式

Styler可以操作ImageView、View、Drawable和Bitmap。对于前三者Styler最终都是在操作Drawable,一旦Styler被构造,就不能再改变操作的对象了。Styler对Bitmap只提供两个静态方法来设置风格。

简单样例

ImageViewimageView=findViewById(R.id.image);Stylerstyler=newStyler.Builder(imageView,Styler.Mode.TECHNICOLOR) .enableAnimation(1000L) .build(); styler.updateUI();//将图片更新为Technicolor//重新设置风格、亮度并更新UI。styler.setMode(Styler.Mode.BLACK_AND_WHITE).setBrightness(100).updateUI();

初始化

Styler没有公有的构造方法,你需要使用Styler.Builder类来构建Styler对象。

简单样例

ImageViewimageView=(ImageView)this.findViewById(R.id.image);Stylerstyler=newStyler.Builder(imageView,Styler.Mode.SEPIA) .enableAnimation(500L) .setContrast(1.5F) .build();

Styler.Builder方法:

//Styler.Builder构造方法,你可以传入ImageViews/Views/Drawables//如需知道Styler具体工作机制请参考源代码//注意在Builder中不能再次设置构造方法中的两个参数Styler.Builderbuilder=newStyler.Builder(View|ImageView|Drawable, mode);//setters//开启动画,必须传入动画时长,可选传入差值器builder.enableAnimation(longanimationDuration[,Interpolatorinterpolator]);//关闭动画,自动重置时长为0,差值器为nullbuilder.disableAnimation(); builder.setBrightness(intbrightness); builder.setContrast(floatcontrast);//调用本方法时会自动将模式设为SATURATIONbuilder.setSaturation(floatsaturation);//设置动画监听器。如果动画没有开启,则不会触发监听器的回调。//监听器会在动画开始、更新与结束时收到回调。//如果之前设置了监听器,调用本方法会清除原先的监听器。builder.setAnimationListener(Styler.AnimationListenerlistener);//构造Styler对象。builder.build();

Styler methods

Styler方法包含上文列举的StyleImageView的所有方法,以及下面几个操作Bitmap与获取Drawable的方法。

//返回styler当前正在操作的drawable对象styler.getDrawable();//Styler静态方法,对Bitmap快速添加风格//brightness, contrast, saturation为可选参数,具体参考上文的默认值//如果mode不是Saturation,而saturation不是1.0,因为saturation为单独的模式,有冲突,会报错Styler.addStyleToBitmap(Contextcontext,Bitmapbitmap,intmode[,intbrightness,floatcontrast,floatsaturation]);

Styler.AnimationListener

//三个回调方法:onAnimation Start();//动画开始时触发//动画更新时触发,timeFraction指时间上动画进行程度,而progress指动画实际进度。//当没有通过enableAnimation()方法设置Interpolator或是设置了LinearInterpolator时,timeFraction和progress是一样的。//progress是Interpolator根据timeFraction计算出的结果。onAnimationUpdate(floattimeFraction,floatprogress); onAnimationEnd();//动画结束时触发
 
标签: Bitmap 安卓开发
反对 0举报 0 评论 0
 

免责声明:本文仅代表作者个人观点,与乐学笔记(本网)无关。其原创性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容、文字的真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
    本网站有部分内容均转载自其它媒体,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责,若因作品内容、知识产权、版权和其他问题,请及时提供相关证明等材料并与我们留言联系,本网站将在规定时间内给予删除等相关处理.

  • 如何进行网络视频截图/获取视频的缩略图
    如何进行网络视频截图/获取视频的缩略图
    小编导读:获取视频的缩略图,截图正在播放的视频某一帧,是在音视频开发中,常遇到的问题。本文是主要用于点播中截图视频,同时还可以获取点播视频的缩略图进行显示,留下一个问题,如下图所示, 如果要获取直播中节目视频缩略图,该怎么做呢?(ps:直播是直
  • 不得不知道的图片加载框架之Glide
    不得不知道的图片加载框架之Glide
    简介在泰国举行的谷歌开发者论坛上,谷歌为我们介绍了一个名叫 Glide 的图片加载库,作者是bumptech。这个库被广泛的运用在google的开源项目中,包括2014年google I/O大会上发布的官方app。特点(1)使用简单(2)可配置度高,自适应程度高(3)支持常见图片
  • 一个实用方便的图片控件SImageView
    一个实用方便的图片控件SImageView
    控件介绍 这是一个简单到 sImageView.setImageUrls(http://img3.cache.netease.com/ent/2009/4/17/20090417104402666a4.jpg); 设置一个网址即可显示图片的控件相对 ImageView 功能的扩展的控件, 但是没有继承 ImageView 直接继承的 View . 比如 QQ群组头像 ,
  • Android开发艺术探索学习笔记(三)—Android性能优化之Bitmap导致的内存溢出
    Android开发艺术探索学习笔记(三)—Android性能
    原本计划是按照章节顺序学习《Android开发艺术探索》这本书的,Android性能优化这部分也是本书的最后一章。但是周末的时候,友盟线下反馈的公司项目的一个错误让我不得不提前学习这一块的知识。先看看线下反馈的错误吧:java.lang.OutOfMemoryError:应用程序
  • Android图形图像使用总结
    Android图形图像使用总结
    一.图形特效(一)特效的实现方式在Android中,提供了3种方式实现特效,setXXX方法,postXXX和preXXX()方法。1.setXXX方法用于直接设置Matrix的值,每使用一次setXXX()方法,整个的Matrix都会变掉。2.postXXX方法用于采用后乘的方式为Matrix设置值,可以连续多次
  • AsyncTask 工作原理(上)
    AsyncTask 是一种轻量级是异步任务类,它可以在线程池中执行后台任何,将执行的进度和最终结果传递给主线程,并在主线程中更新UI。AsyncTask 是一个抽象类,其构造函数//Params:传入doInBackground 中的参数类型//Progress: 后台执行进度的类型,传入onProgre
  • vysor 原理以及 Android 同屏方案
    vysor是一个免root实现电脑控制手机的chrome插件,目前也有几款类似的通过电脑控制手机的软件,不过都需要root权限,并且流畅度并不高。vysor没有多余的功能,流畅度也很高,刚接触到这款插件时我惊讶于它的流畅度以及免root,就一直对它的实现原理很感兴趣。
  • 简单实现 Android 图片三级缓存机制
    简单实现 Android 图片三级缓存机制
    用户在使用我们的APP时,通常会重复浏览一些图片,这时如果每一次浏览都需要通过网络获取图片,那么将会非常流量。为了节省用户流量,提高图片加载效率,我们通常使用图片三级缓存策略,即通过网络、本地、内存三级缓存图片,来减少不必要的网络交互,避免浪
  • Picasso 解析 (1)- 一张图片是如何加载出来的
    前言Picasso是JakeWharton大神在github上的一个开源图片加载框架,使用起来极其方便,甚至只需要一行代码就可以搞定图片加载:Picasso.with(context).load(http://i.imgur.com/DvpvklR.png).into(imageView);具体如何使用该框架我就不在这里赘述了,大家可以
  • 自定义圆形图片、可控位置圆角图片
    自定义圆形图片、可控位置圆角图片
    一.原理1.下面的Xfermode子类可以改变这种行为:AvoidXfermode 指定了一个颜色和容差,强制Paint避免在它上面绘图(或者只在它上面绘图)。PixelXorXfermode 当覆盖已有的颜色时,应用一个简单的像素XOR操作。PorterDuffXfermode 这是一个非常强大的转换模式,
点击排行