图片压缩后再上传
1 | private void uploadHeadPortrait(Uri imgUri) { |
上面用到底下的图片压缩
、Bitmap处理:变圆、读取、存、缩放等
ImageCompress图片压缩
1 | package rongshanghui.tastebychance.com.rongshanghui.util; |
在前面的GGBA颜色制作特效这篇笔记中,说了图片由像素组成,像素由
色相,饱和度,亮度组成。当图片的像素不变时,把它读取到内存中不是不会节省开销的。
这里有一个压缩质量的方法来压缩图片,要把图片压缩到100k以下
1 | public static void compressBmpToFile(Bitmap bmp,File file){ |
如果原来你读取图片时发生内存溢出,然后高兴的去调用这个方法,你会发现,并没什么卵用。
还是照样溢出。
这是为什么呢?这个图片压缩的是质量,图片的长宽没变,然后得像素不变,然后得出不会节省内存的结论。
所以该溢出还是要溢出。
那么是什么让图片质量下降了?官方文档说这是像素组成元素中的亮度被抛弃的缘故。所以质量压缩会让
图变得模糊。
那么怎么才能降低像素呢,那自然是调整长宽。
长宽变小了,像素自然低了。
1 | private Bitmap compressImageFromFile(String srcPath) { |
Bitmap处理:变圆、读取、存、缩放等
1 | package rongshanghui.tastebychance.com.rongshanghui.util; |
自己定义的多种图片缓存(Java六大原则)
自定义图片缓存策略
- 定义缓存接口
1 | public interface ImageCache { |
- 内存缓存
1 | public class MemoryCache implements ImageCache { |
- sd卡缓存
1 | public class DiskCache implements ImageCache{ |
- 双缓存
1 | public class DoubleCache implements ImageCache { |
- 关闭流的类
1 | public class CloseableUtil { |
- 图片加载
1 | public class ImageLoader { |
调用
1 | ImageLoader imageLoader = new ImageLoader(); |
ImageIO图片工具类(获取路径、保存相册等)
1 | package com.u1city.androidframe.common.file.image; |
Pic2Ascii图片转ascii码
1 | package me.veryyoung; |
截图工具类
1 | package com.u1city.androidframe.common.image.screenshot; |
指定View的截图
截图
1 | import android.app.Activity; |
图片选择器
Android图片处理:多合一,多张生成视频,裁剪,滤镜色调,饱和度,亮度,缩放调整
前言
Android图片美化处理的意义主要体现在以下几个方面:
- 增强用户体验:通过美化图片,可以显著提升用户的使用体验。美化后的图片在构图、色彩和细节上都能得到优化,使得整体画面通透、明亮,提升了视觉享受。
- 展现个性:美化处理的图片能够增加社交媒体垂直账号的独特个性,增强归属感,还能展示用户的审美品味和兴趣爱好。通过选择不同的壁纸背景,用户可以在社交场合中留下深刻印象1。
- 提升照片质量:通过美图功能,可以对照片进行裁剪、滤镜调节、亮度对比度调整等操作,从而提升照片的整体美观和质量。即使在光线条件不佳的情况下,也能轻松处理拍摄出的照片,使其焕发出炫目的艺术魅力2。
- 社会心理影响:在社交媒体上,经过精心修饰的照片往往能吸引更多的关注和点赞,成为个人形象和社交资本的一部分。这种对“精修”的追求反映了人们对于视觉享受和社会认同的需求。
- 技术进步的体现:随着智能手机摄像头的升级和修图软件的普及,人们开始有能力对自己的照片进行“精修”,从简单的磨皮美白到复杂的场景替换、风格转换,修图技术让每一张照片都有可能变成一幅艺术品3
本文重点从以下4个维度
对图片处理进行介绍:
- 多张图片拼合成一张
- 多张图片合成视频影片
- 图片的裁剪
- 图片大小缩放
- 图片的滤镜:色调,饱和度,亮度调整
多张图片拼合成一张
- Android 原生对图片合并处理主要是对突变bitmap进行处理:
如下代码:是从左到右依次拼接
,
当然可以调整成:
从上到下依次拼接,上下规则形网格,或者不规则形网格自定义拼接
1 | private fun mergeImages(bitmaps: List<Bitmap>): Bitmap { |
- 上面返回成bitmap 可以直接展示预览使用,也可以通过如下代码保存起来,注意文件读写权限
1
2
3
4
5
6private fun saveToLocal(bitmap: Bitmap) {
val path = Environment.getExternalStorageDirectory().absolutePath + "/merged.jpg"
FileOutputStream(path).use { fos ->
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, fos)
}
}
多张图片生成视频:
Android中通过图片生成视频步骤:
- 将图片先转成bitmap,然后再将bitmap转成YUV420(它是图像色彩存储的一种常见格式,如需要深入需要对视频编码原理进行自我相关知识补充)
- 通过原生
MediaCodec
对图片处理后的YUV420数据进行编码,编码结束通过MediaMuxer
对编码后的数据进行封装成Mp4格式,也可以添加相关音频文件作为背景音乐。 - 关于
MediaCodec
和MediaMuxer
相关Api功能介绍,请参考我之前的文章: - 需要注意的是:每张图片的宽高需要保持一致,如果大小不一,可以先自行进行相关放大缩小处理
- 具体代码如下:
1 |
|
- 需要注意的是上面这个位置: 理论上是不需要对同一张图片的yuv数据进行重复编码, 如果图片比较少情况下,根据每张图片索引 index 计算出的时间 computePresentationTime 会很短,可能都不到1秒时间,这样视频时长很短,播放不了。
1 | for (i in 0 until count) { |
- 注意文件读写权限
图片裁剪
Android 原生对图片进行裁剪主要是对bitmap的处理,配置剪裁目标宽高:
1 | /** |
图片放大缩小成指定尺寸后保存
Android 图片缩放主要是对Bitmap.scale进行操作,指定缩放后目标图片宽高,注意文件读写权限,代码如下
1 | /**图片放大缩小成指定尺寸后保存 |
图片滤镜色调,饱和度,亮度调整
Android 原始图片的滤镜也是对bitmap进行处理,结合ColorMatrixColorFilter
和ColorMatrix
使用
ColorMatrixColorFilter
: 是Android 开发中用于图形处理的一个重要工具,它通过颜色矩阵(ColorMatrix
)来实现复杂的颜色变换效果。ColorMatrixColorFilter
属于Paint API
的一部分,主要用于改变绘制的颜色,包括调整亮度、对比度、饱和度,或者应用特定的视觉效果如黑白、复古等ColorMatrix
是一种用于图像处理的技术,主要通过调整图像的RGB(红、绿、蓝)通道来改变图像的颜色效果。ColorMatrix是一个5x4的矩阵
,可以通过修改矩阵中的元素来改变图像中RGBA各分量的值,从而实现各种颜色效果。- 色调、饱和度、亮度 通过 **
ColorMatrix的PostConcat相乘
**,对原始图片进行变换处理使用代码如下:
1 | /** |
4. ColorMatrix.setRotate
方法:用于设置图像的色调旋转。该方法接受两个参数:轴(axis
)和旋转角度(degree
)。
其中参数:
- axis:指定旋转的轴,可以是0、1或2,分别代表红色(R)、绿色(G)、蓝色(B)。
- degree:旋转的角度,取值范围为-180度至180度。
ColorMatrix的setSaturation
方法用于设置图像的饱和度。ColorMatrix
是一个4x5
的矩阵,通过矩阵乘法和加法实现颜色的转换。setSaturation
方法:通过调整颜色矩阵中的元素来改变图像的饱和度。具体来说,setSaturation
方法会将颜色矩阵重置为一个初始状态,然后根据传入的饱和度参数调整R、G、B三个颜色的权重,从而实现饱和度的变化。
- 饱和度参数
sat
的取值范围是: 0到1,其中0表示灰度图像,1表示原图,取值越大,色彩饱和度越高
ColorMatrix.setScale
方法用于设置颜色矩阵的比例缩放值。
该方法接受四个参数:
rScale、gScale、bScale和aScale
,分别表示红色、绿色、蓝色和透明度的缩放比例
- 也可以直接通过
ColorMatrix.set(矩阵数组)
:比如:将矩阵中的某些值设置为0可以实现黑白效果1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20黑白效果
val mBWMatrix = floatArrayOf(
1f, 0f, 0f, 0f, 0f,
0f, 1f, 0f, 0f, 0f,
0f, 0f, 1f, 0f, 0f,
0f, 0f, 0f, 1f, 0f
)
//设置矩阵数组
fun setImageMatrix(mBitmap:Bitmap,mColorMatrix: FloatArray) {
val bmp = createBitmap(mBitmap.getWidth(), mBitmap.getHeight())
val colorMatrix = ColorMatrix()
colorMatrix.set(mColorMatrix)
val canvas = Canvas(bmp)
val paint = Paint()
paint.setColorFilter(ColorMatrixColorFilter(colorMatrix))
canvas.drawBitmap(mBitmap, 0f, 0f, paint)
ivImage.setImageBitmap(bmp)
}
总结
本文重点介绍了:
- 如何实现多张图片拼合成一张
- 如何实现多张图片合成视频影片
- 如何实现图片的裁剪
- 如何实现图片大小缩放
- 如何实现图片的滤镜:色调,饱和度,亮度调整