浅谈android中图片处理之图形变换特效Matrix(四)

2024-08-27 14:48

本文主要是介绍浅谈android中图片处理之图形变换特效Matrix(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

今天,我们就来谈下android中图片的变形的特效,在上讲博客中我们谈到android中图片中的色彩特效来实现的。改变它的颜色主要通过ColorMatrix类来实现。
现在今天所讲的图片变形的特效主要就是通过Matrix类来实现,我们通过上篇博客知道,改变色彩特效,主要是通过ColorMatrxi矩阵的系数,以及每个像素点上所对应的颜色偏移量。而今天的图形变换与那个也是非常的类似。它是一个3*3矩阵,而颜色矩阵则是一个4*5的矩阵。在这个3*3矩阵中则表述出了每个像素点的XY坐标信息。然后通过修改这个矩阵,就可达到修改图片中的每个像素点的XY坐标,即改变每个像素点的位置信息,通过对特定的矩阵元素值的修改就可以达到实现图片的中的
图形变换特效如:平移变换特效,旋转变换特效,缩放变换特效,错切变换特效。那么接下来我们就通过从原理的角度来一一分析下每个特效对应的矩阵是怎么样的。
默认的图形变换的初始矩阵是:
                        1  0  0 
                        0  1  0
                        0  0  1
  第一、平移变换特效:
                 我们很容易知道这个,在一个平面中,将一个像素点从位置A(x0,y0)移到另一个位置B(x,y)
很容易得到如下的公式:
                   x=x0+X方向的偏移量(xt);
                   y=y0+Y方向的偏移量(yt);
依据上面的等式我们很容易得到如下矩阵:


      |x|     |1 0 xt|  |x0|
                   |y| =  |0 1 yt| ×    |y0|
                   |1|     |0 0  1|       | 1 |
然后我们通过如上的矩阵乘法计算得到等式(与我们得出的结论一致,所以也就是我们通过改变初始矩阵中那个矩阵元素的值就可以实现图片在X,Y方向上的平移):
                    x=x0+X方向的偏移量(xt);
                    y=y0+Y方向的偏移量(yt);
 第二、旋转变换特效:


                   所谓旋转变换就相当于一个像素点围绕某个中心点O旋转到一个新的点,在高中学过三角函数的都知道,通过从初始点A(x0,y0)旋转到B点(x,y)
初始点与X轴正方向夹角为a,旋转过的角度为t,通过三角函数的计算得出如下公式:
                  设:旋转轴长为:r
                   x0=r*cosa;  y0=r*sina;
                   x=r*cos(a+t)=r*cosa*cost-rsina*sint=x0*cost-y0*sint;
                   y=r*sin(a+t)=r*sina*cost+r*cosa*sint=y0*cost+x0*sint;
从而可以得出如下矩阵:
                    |x|    |cost -sint 0| |x0|
                    |y| = |sint  cost 0| ×|y0|
                    |1|    |0      0     1|    | 1 |
然后我们通过如上的矩阵乘法计算得到等式(与我们得出的结论一致,所以也就是我们通过改变初始矩阵中那个矩阵元素的值就可以实现图片旋转):


                   x=x0*cost-y0*sint;
                                                                  y=y0*cost+x0*sint;
注意:前面所讲的旋转都是以坐标的原点为旋转中心的,我们还可以以任意点O为旋转中心来进行旋转的变换但是通常需要如下三个步骤:
首先第一需要将坐标的原点平移到任意指定的点O,然后再使用上述我们的所讲的旋转方法来进行旋转,最后就需要将我们的原点还原回去。
第三、缩放变换特效:
                 所谓像素点的缩放,实际上并不会对像素点缩放,因为像素点已经够小了,不存在什么缩放的概念,那我们这里所说的缩放是怎么样的呢?
我们是通过将每个像素点所在的XY坐标按一定的比例缩放,然后使得图片整体看起来的有一个缩放的效果。
                    x=K1*x0
                                    y=K2*y0 
通过以上公式反映到我们的变换矩阵中的形式:
                              |x|    |K1 0 0| |x0|
                      |y| = |0 K2 0| ×|y0|
                      |1|    |0 0   1|   | 1 |
通过矩阵乘法验证得到等式(与我们得出的结论一致,所以也就是我们通过改变初始矩阵中那两个矩阵元素的值就可以实现图片在X,Y方向上的缩放)
第四、错切变换特效:
                所谓错切变换的效果很类似数学上的Shear mapping.错切主要分两种形式:
第一水平错切变换:就是在正常图片的基础上,让每个像素点的Y轴坐标保持不变,而让他们的X坐标按一定比例的缩放,第二就是垂直错切变换:就是在原图的基础上,让让每个像素点的X坐标保持不变,让Y坐标按一定比例的缩放。从而可以得到如下的变换公式:
                 x=x0+K1*y0;y=x0+K2*y0;
通过以上的公式反应到我们的变换矩阵中的形式:
                 
      |x|    |1    K1  0| |x0|
                   |y| =  |K2  1   0| ×|y0|
                   |1|    |0     0    1|  | 1 |
通过矩阵乘法验证得到等式(与我们得出的结论一致,所以也就是我们通过改变初始矩阵中那两个矩阵元素的值就可以实现图片在X,Y方向上的错切)
综合上述:将得出我们最后的矩阵变换公式:
                    |Scale_X Skew_X  Trans_X|
                    |Skew_Y  Scale_Y Trans_Y|
                    | 0               0             1        |
也就是我只需要改变矩阵中对应的元素的值,我们就可以实现各种变换的特效。
如果用A,B,C,D,E,F来一次标示那些区的话,A和E决定缩放变换,B和D决定了错切变换,C和F决定了平移变换

下面我们就通过一个Demo来验证一下我们的观点。 

package com.mikyou.matrix;import java.util.ArrayList;
import java.util.List;import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.os.Bundle;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;public class MainActivity extends Activity {private ImageView iv;private Canvas canvas;private Paint paint;private Bitmap baseBitmap;private Bitmap copyBitmap;private Matrix matrix;private EditText e1,e2,e3,e4,e5,e6,e7,e8,e9;private float t1,t2,t3,t4,t5,t6,t7,t8,t9;private List<Float> valueList;public void ok(View view){valueList=new ArrayList<Float>();valueLis

这篇关于浅谈android中图片处理之图形变换特效Matrix(四)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111972

相关文章

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Android ClassLoader加载机制详解

《AndroidClassLoader加载机制详解》Android的ClassLoader负责加载.dex文件,基于双亲委派模型,支持热修复和插件化,需注意类冲突、内存泄漏和兼容性问题,本文给大家介... 目录一、ClassLoader概述1.1 类加载的基本概念1.2 android与Java Class

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python使用vllm处理多模态数据的预处理技巧

《Python使用vllm处理多模态数据的预处理技巧》本文深入探讨了在Python环境下使用vLLM处理多模态数据的预处理技巧,我们将从基础概念出发,详细讲解文本、图像、音频等多模态数据的预处理方法,... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

Spring Boot @RestControllerAdvice全局异常处理最佳实践

《SpringBoot@RestControllerAdvice全局异常处理最佳实践》本文详解SpringBoot中通过@RestControllerAdvice实现全局异常处理,强调代码复用、统... 目录前言一、为什么要使用全局异常处理?二、核心注解解析1. @RestControllerAdvice2

利用Python脚本实现批量将图片转换为WebP格式

《利用Python脚本实现批量将图片转换为WebP格式》Python语言的简洁语法和库支持使其成为图像处理的理想选择,本文将介绍如何利用Python实现批量将图片转换为WebP格式的脚本,WebP作为... 目录简介1. python在图像处理中的应用2. WebP格式的原理和优势2.1 WebP格式与传统

Android DataBinding 与 MVVM使用详解

《AndroidDataBinding与MVVM使用详解》本文介绍AndroidDataBinding库,其通过绑定UI组件与数据源实现自动更新,支持双向绑定和逻辑运算,减少模板代码,结合MV... 目录一、DataBinding 核心概念二、配置与基础使用1. 启用 DataBinding 2. 基础布局

Android ViewBinding使用流程

《AndroidViewBinding使用流程》AndroidViewBinding是Jetpack组件,替代findViewById,提供类型安全、空安全和编译时检查,代码简洁且性能优化,相比Da... 目录一、核心概念二、ViewBinding优点三、使用流程1. 启用 ViewBinding (模块级

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Python如何去除图片干扰代码示例

《Python如何去除图片干扰代码示例》图片降噪是一个广泛应用于图像处理的技术,可以提高图像质量和相关应用的效果,:本文主要介绍Python如何去除图片干扰的相关资料,文中通过代码介绍的非常详细,... 目录一、噪声去除1. 高斯噪声(像素值正态分布扰动)2. 椒盐噪声(随机黑白像素点)3. 复杂噪声(如伪