Android自定义控件(九)——如何让图片颜色更鲜艳以及给图片添加水印

简介: Android自定义控件(九)——如何让图片颜色更鲜艳以及给图片添加水印

Bitmap像素是否可以更改


在前面一节中,我们详细介绍了两种创建Bitmap的方式,一种是使用BitmapFactory,一种是使用Bitmap静态方法,但这里我有一个需求,假如我有一张图片,绿色的颜色非常丰富,但绿色很暗,这个时候我想要修改该图片每个像素中的绿色值,用这两种方式创建的Bitmap都能直接修改吗?


答案是否定的,所有使用 BitmapFactory创建的Bitmap都是不可更改其像素值的,只有通过Bitmap以下几种函数创建的Bitmap才能完成如上需求,代码如下:

#只有这三个方法生成的Bitmap可以进行像素更改操作
copy(Bitmap.Config config,boolean isMutable)
createBitmap(int width,int height,Bitmap.Config config)
createScaledBitmap(Bitmap src,int dstWidth,int dstHeight,boolean filter)


不过我们这里需要注意的一点是,使用createScaledBitmap创建Bitmap时,如果源图像的宽高与生成图像的宽高一致,那么会直接返回源图像,不会生成新的图像,如果源图像不可更改,那么新图像也不可更改,如果源图像可以更改,那么新图像也可以更改。


Copy()函数


今天我们的实现主要用的就是Copy()函数,所以我们需要重点来讲解以下,这个函数,我们先来看看这个函数的定义:

copy(Bitmap.Config config,boolean isMutable)

Config config:像素在内存中的存储格式,取值有ARGB_8888等四个值,不知道的可以返回小编上一篇的博文。


boolean isMutable:新创建的Bitmap是否可以更改其中的像素。


该函数的意思时根据源图像创建一个副本,但可以指定副本的像素存储格式,同时可以自己定义是否可以更改其像素值。


setPixel(),getPixel()


因为要更改某图片的像素值,所以必须要用到这两个设置,和获取像素值的函数,他们的定义如下:

public void setPixel(int x,int y,int color)
public void getPixel(int x,int y)


很明显,x,y是获取某图片像素点的坐标值,color是需要设置该像素值为哪个颜色,下面我们来看一张图片,如下图所示:

40.png

我们可以看到这张图片的绿色草坪,颜色有点偏暗,所以我们接下来需要通过上面讲解的所有函数,把图片的绿色变得更亮。


让图片变得更鲜艳


首先我们需要定义两个ImageView,方便后续进行对比,一个直接显示源图像,一个后续进行设置,XML代码如下:

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:src="@drawable/dog"/>
<ImageView
    android:id="@+id/imageview"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"/>


定义好之后,我们直接在主Activity中获取到id为imageview的控件,然后首先使用copy()函数进行复制一张可以编辑像素的Bitmap,代码如下:

this.imageView=(ImageView) findViewById(R.id.imageview);//获取控件
Bitmap srcBitmap= BitmapFactory.decodeResource(getResources(),R.drawable.dog);//获取源图片,srcBitmap不可编辑像素
Bitmap dstBitmap=srcBitmap.copy(Bitmap.Config.ARGB_8888,true);copy后设置true,dstBitmap就是可以设置像素的Bitmap


这里我们获取到了可编辑Bitmap后,下面直接遍历该bitmap每个像素值,然后获取到颜色值,进行对比,在调升我们每个像素的绿色比重,代码如下:

for(int h=0;h<srcBitmap.getHeight();h++){// 行
    for(int w=0;w<srcBitmap.getWidth();w++){//列
        int pixel=srcBitmap.getPixel(w,h);//获取该点像素值
        int red= Color.red(pixel);//获取该点像素值的红色值
        int alpha= Color.alpha(pixel);//获取该点像素值的透明值
        int green= Color.green(pixel);//获取该点像素值的蓝色值
        int blue= Color.blue(pixel);//获取该点像素值的绿色值
  if(green<200){//当绿色小于200,最高255
    green+=50;//加50
  }
  dstBitmap.setPixel(w,h,Color.argb(alpha,red,green,blue));//然后修改该dstBitmap该点像素值
  }
}
this.imageView.setImageBitmap(dstBitmap);//设置到iamgeview控件中


这里的代码很好理解,就是遍历获取每个像素值,然后获取该像素值的红,蓝,绿以及透明度的值,当绿色值小于200的时候,更改绿色值,然后设置到可以更改颜色的dstBitmap中。


备注:这里有一点需要主要,为什么需要判断小于200才能加50呢?我们都知道ARGB_8888颜色值的最大值是255,假如现在有个颜色值是250,你不小心也加了50,那么就是300,那么程序会设置300吗?不会,那么程序会自动向下取整吗?也不会,颜色值计算是取余的,也就是说,假如你更改了某个颜色值为300,那么它只会设置成45,并不会设置成你希望的255。

41.png

这里你也可以通过遍历判断所有像素点哪个颜色值更高,然后统计分别自加计算红绿蓝最高的数值各有多少,然后再遍历一次单独给最高最多的颜色设置值,以达到让某图片最多的颜色更鲜艳的目的。


给图片添加水印


下面我们来实现大多数APP经常使用到的功能给图片添加水印,其实代码很简单,我们来看看这段代码:

/***
* 添加水印
* @param srcBitmap源图像
* @param watermark水印图像
* @return
*/
private Bitmap createWaterMarkBitmap(Bitmap srcBitmap, Bitmap watermark){
  if(srcBitmap==null){
  return null;
  }
  int srcWidth=srcBitmap.getWidth();//获取源图像的宽
  int srcHeight=srcBitmap.getHeight();//获取源图像的高
  int waterWidth=watermark.getWidth();//获取水印图像的宽
  int waterHeight=watermark.getHeight();//获取水印图像的高
  Bitmap bitmap=Bitmap.createBitmap(srcWidth,srcHeight,Bitmap.Config.ARGB_8888);//创建一个空白位图
  Canvas canvas=new Canvas(bitmap);//根据位图创建画布
  canvas.drawBitmap(srcBitmap,0,0,null);//先画出源图像
  canvas.drawBitmap(watermark,srcWidth-waterWidth+5,srcHeight-waterHeight+5,null);//然后在画水印图像
  return bitmap;//返回水印图片
}


代码注释已经非常详细了,这里就是简单的叠加绘制流程,创建一个空白位图,先画源图像,再在右下角画水印图像即可,详细的计算看下图就明白了:

42.png

接着我们还需要创建一个ImageView放置水印图像,这里的XML代码就不写了,和上面差不多,除了Id不同之外,其他的设置调用代码如下:

this.imageView2=(ImageView)findViewById(R.id.imageview2);
this.imageView2.setImageBitmap(createWaterMarkBitmap(dstBitmap,BitmapFactory.decodeResource(getResources(),R.drawable.water)));


这样我们就实现了给图片添加水印的效果,实现的效果如下图所示:

43.png

本文的实现代码以及上篇文章的实现代码Github下载地址:点击下载

相关文章
|
4月前
|
API Android开发 开发者
Android颜色渐变动画效果的实现
本文介绍了在Android中实现颜色渐变动画效果的方法,重点讲解了插值器(TypeEvaluator)的使用与自定义。通过Android自带的颜色插值器ArgbEvaluator,可以轻松实现背景色的渐变动画。文章详细分析了ArgbEvaluator的核心代码,并演示了如何利用Color.colorToHSV和Color.HSVToColor方法自定义颜色插值器MyColorEvaluator。最后提供了完整的源码示例,包括ColorGradient视图类和MyColorEvaluator类,帮助开发者更好地理解和应用颜色渐变动画技术。
132 3
|
4月前
|
Java Android开发
Android背景颜色滑动渐变效果(上下滑动,左右滑动)
本文分享了一种通过ScrollView实现滑动变色效果的简单方法。主要步骤包括:1) 在布局中添加ScrollView并确保内容可滑动;2) 获取屏幕高度;3) 获取控件高度;4) 使用GradientDrawable设置渐变颜色;5) 根据控件与屏幕高度比例动态调整颜色数量。示例代码展示了如何在滑动时根据比例改变背景颜色,实现流畅的视觉效果。
148 0
|
4月前
|
XML Android开发 数据格式
Android利用selector(选择器)实现图片动态点击效果
本文介绍了Android中ImageView的`src`与`background`属性的区别及应用,重点讲解如何通过设置背景选择器实现图片点击动态效果。`src`用于显示原图大小,不拉伸;`background`可随组件尺寸拉伸。通过创建`selector_setting.xml`,结合`setting_press.xml`和`setting_normal.xml`定义按下和正常状态的背景样式,提升用户体验。示例代码展示了具体实现步骤,包括XML配置和形状定义。
199 3
Android利用selector(选择器)实现图片动态点击效果
|
4月前
|
Java Android开发
Android图片的手动放大缩小
本文介绍了通过缩放因子实现图片放大缩小的功能,效果如动图所示。关键步骤包括:1) 在布局文件中设置 `android:scaleType=&quot;matrix&quot;`;2) 实例化控件并用 `ScaleGestureDetector` 处理缩放手势;3) 使用 `Matrix` 对图片进行缩放处理。为避免内存崩溃,可在全局配置添加 `android:largeHeap=&quot;true&quot;`。代码中定义了 `beforeScale` 和 `nowScale` 变量控制缩放范围,确保流畅体验。
149 8
|
4月前
|
缓存 编解码 Android开发
Android内存优化之图片优化
本文主要探讨Android开发中的图片优化问题,包括图片优化的重要性、OOM错误的成因及解决方法、Android支持的图片格式及其特点。同时介绍了图片储存优化的三种方式:尺寸优化、质量压缩和内存重用,并详细讲解了相关的实现方法与属性。此外,还分析了图片加载优化策略,如异步加载、缓存机制、懒加载等,并结合多级缓存流程提升性能。最后对比了几大主流图片加载框架(Universal ImageLoader、Picasso、Glide、Fresco)的特点与适用场景,重点推荐Fresco在处理大图、动图时的优异表现。这些内容为开发者提供了全面的图片优化解决方案。
159 1
|
4月前
|
Android开发 开发者
Android自定义view获取attr中自定义颜色的问题
本文针对Android自定义View在布局中设置颜色时遇到的问题进行分析与解决。问题表现为通过`getAttributeIntValue`方法获取颜色时,使用资源引用(如`@color/colorPrimary`)无法正确获取,而直接使用十六进制颜色值(如`#ff0000`)则正常。经过源码分析,发现是属性格式定义及获取方式不当导致。解决方案为将`attrs`文件中颜色属性的格式改为`reference|color`,并使用`TypedArray`的`getColor`方法获取颜色值,确保资源引用和直接颜色值均能正确解析。希望本文能帮助遇到类似问题的开发者。
|
11月前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件实践
【10月更文挑战第4天】在安卓开发的海洋中,自定义控件是那片璀璨的星辰。它不仅让应用界面设计变得丰富多彩,还提升了用户体验。本文将带你探索自定义控件的核心概念、实现过程以及优化技巧,让你的应用在众多竞争者中脱颖而出。
|
9月前
|
搜索推荐 Android开发 开发者
安卓应用开发中的自定义控件实践
在安卓应用开发的广阔天地中,自定义控件如同璀璨的星辰,点亮了用户界面设计的夜空。它们不仅丰富了交互体验,更赋予了应用独特的个性。本文将带你领略自定义控件的魅力,从基础概念到实际应用,一步步揭示其背后的原理与技术细节。我们将通过一个简单的例子——打造一个具有独特动画效果的按钮,来展现自定义控件的强大功能和灵活性。无论你是初学者还是资深开发者,这篇文章都将为你打开一扇通往更高阶UI设计的大门。
109 2
|
存储 缓存 编解码
Android经典面试题之图片Bitmap怎么做优化
本文介绍了图片相关的内存优化方法,包括分辨率适配、图片压缩与缓存。文中详细讲解了如何根据不同分辨率放置图片资源,避免图片拉伸变形;并通过示例代码展示了使用`BitmapFactory.Options`进行图片压缩的具体步骤。此外,还介绍了Glide等第三方库如何利用LRU算法实现高效图片缓存。
161 20
Android经典面试题之图片Bitmap怎么做优化
|
11月前
|
缓存 搜索推荐 Android开发
安卓开发中的自定义控件基础与进阶
【10月更文挑战第5天】在Android应用开发中,自定义控件是提升用户体验和界面个性化的重要手段。本文将通过浅显易懂的语言和实例,引导你了解自定义控件的基本概念、创建流程以及高级应用技巧,帮助你在开发过程中更好地掌握自定义控件的使用和优化。
193 10