图像处理
文章平均质量分 58
cjzcjl
吃了一碟炒鱿鱼
展开
-
Android使用ANativeWindow更新surfaceView内容最简Demo
安卓的普通VIew,都依赖于当前Activity的Window的surface,这个surface用于承载view树从底到顶绘制出来的所有内容,因此任何一个view需要更新时,都需要把所有view中底到顶进行更新,即使使用脏区域,也依然要把其他view中相应的像素进行合成操作,因此不适合频繁的更新绘制,而且更新过程只能依靠UI线程。而SurfaceView却有自己的Surface,因此可以单独更新其内容而不触发整个view树的更新,在子线程刷新不会阻塞主线程,适用于界面频繁更新、对帧率要求较高的情况,因原创 2024-07-15 21:10:04 · 1022 阅读 · 0 评论 -
Android OpenGL ES 离屏幕渲染2——获取渲染结果并显示到ImageView控件中,使用最简模型展示
本文将用一个不包含顶点shader和片元shader的最小模型讲述如何把通过EGL创建的OpenGL ES环境渲染后的结果进行提取,单纯输出一片铺满视口的红色的像素。原创 2024-07-07 15:09:03 · 1014 阅读 · 0 评论 -
Android OpenGL ES 离屏幕渲染1——EGL环境的创建,以及基础概念的理解
本文主要是介绍EGL的概念、作用,为后续的离屏渲染做铺垫。下一篇文章将开始介绍EGL环境创建后如何进行OpenGL ES API调用,并把结果进行提取。原创 2024-07-07 11:37:06 · 956 阅读 · 0 评论 -
GL绘制自定义线条4_使用OpenGL ES实现钢笔效果
通过原点两侧创建两个原始端点,长度根据压力值或速率进行调整,再根据两个触摸点构成的向量旋转它,再移动它到触摸点的位置,构成包络点,并使用插值逻辑平滑处理一下,使用GL_TRIANGLE_STIPS方式绘制,即可实现该效果。CSDN之前自动生成的摘要居然自带广告,简直离谱!原创 2024-02-29 21:56:57 · 608 阅读 · 0 评论 -
Android开发经验记录_对多个Path形成的图形进行填充踩坑与怕坑记录
网络上大部分文章都是描写单个Path如何进行颜色填充,没有描写多个Path组合起来如何正确填充颜色,我自己摸索了一个比较合理的形式。原创 2023-12-13 15:52:18 · 238 阅读 · 0 评论 -
GL绘制自定义线条3_自定义线帽
在安卓中使用OpenGL绘制如Path+Paint一样效果的书写线条,并附带笔帽效果实现原创 2023-05-15 11:57:35 · 634 阅读 · 1 评论 -
GL绘制自定义样式线条
使用OpenGL绘制自定义曲线的原理推导和粗略实现原创 2023-05-06 11:13:09 · 257 阅读 · 0 评论 -
GL绘制自定义线条2_手写曲线应用贝塞尔曲线
假定我现在有3个顶点(P0、P1、P2),想以曲线的方式进行绘制其路径,那么可以从P0到P1、P1到P2两个线段,按照同样的百分比步进量,沿着这两个线段对应百分比的位置连接为一个新的线段(图中绿色部分),然后取这个线段同样百分比位置的坐标,将这些坐标连城线即可得到一端曲线。上一篇文章的曲线是由触摸点直接生成的,但触摸点并非连续的,而是离散的,而且屏幕触摸点采样的间隔时间其实不短,因此如果单纯只用触摸点生成OpenGL触摸曲线,在高速书写时会导致曲线看起来就像多个线段合起来一样(事实也是如此)。原创 2023-05-08 21:52:55 · 639 阅读 · 0 评论 -
再说fragshader特效_膨胀效果的数学推导
PS中的液化功能中的膨胀效果在fragshader实现时的数学推导过程原创 2023-03-15 22:40:34 · 369 阅读 · 0 评论 -
JPEG图像压缩探索_zigzag扫描(原创)
在DCT图像变换完成后,需要把数据从高频到低频频域强度信号进行筛选等操作,为了方便算法进行操作,最好转化为一个一维的数据。本文介绍适合从左上到右下将数据转化为一维数据的方法以及个人实现。原创 2023-02-22 10:54:08 · 1350 阅读 · 0 评论 -
透视投影的一些简短推导
投射投影规律的简单总结,通过眼球模型开展。原创 2022-12-11 22:26:15 · 471 阅读 · 0 评论 -
使用两个FBO互相绑定实现PS液化效果(2)_使用PBO保存FBO当前画面
使用PBO保存当前FrameBuffer的帧原创 2022-09-08 00:08:06 · 252 阅读 · 0 评论 -
创造一款安卓自定义控件_任意4顶点裁剪框2_为裁剪框添加放大镜功能
if (null != selectPoint && MotionEvent.ACTION_UP != mCurrentAction) { Path scopeArea = new Path(); int w = (int) MeasurelUtils.convertDpToPixel(100, getContext()); int h =...原创 2022-05-19 19:29:20 · 301 阅读 · 1 评论 -
创造一款安卓自定义控件_任意4顶点裁剪框
最终效果:一种可以不规则截取图片的自定义控件规则描述:1、 要有三点之间构成了两个线段所组成的角度判断能力,不允许超过180度的角度出现,以免导致出现凹进去的形状。2、不允许构成线段的端点两年交换导致线条出现相交。实际构成:1、裁剪框由4个端点所组成,在这里我使用了顺时针的方向排布了这4个点。2、对规则1的实施,使用了代码:其中first到middle是第一条线段端点,middle到end是第二条线条的端点: private double lin原创 2022-04-24 23:07:36 · 775 阅读 · 4 评论 -
二维旋转的实质的直观理解
以旋转90度为例,把指针拆分成x和y两个分量,可以发现随着旋转角度的增大,x和y分量所产生的周期波形刚好有90度的相位差,当一方最大时另一方最小,因此才会有旋转公式:原创 2022-04-18 21:15:39 · 257 阅读 · 0 评论 -
PDF reference 学习笔记
原创 2022-04-12 23:28:19 · 543 阅读 · 0 评论 -
JPEG图像压缩探索_DCT变换的应用
对于图像处理来说,细节部分一般具有亮度起伏大、较短的尺度下亮度变化次数多的特点,转换为数学方式的描述,就是图像细节部分一般为“高频信号”,因此,如果能使用“分频器”,把图像的“时域信号”转化为“频域信号”,即可实现筛选走一部分高频信号,只保留高频信号,使得表达图像时需要的空间减少。原创 2022-03-20 00:05:40 · 3128 阅读 · 1 评论 -
使用OES纹理+GLSurfaceView+JNI实现基于OpenGL ES的播放器画面处理
安卓使用SurfaceView + SurfaceTexture + Surface进行视频播放或者相机预览,只能看到原色画面,但很多场合需求画面可以实现二次加工,例如调整红绿蓝三原色的比例、添加滤镜、降噪等,此时如果使用GLSurfaceview搭配GL Shader Language进行基于GPU的实时处理,就可以又快又节能地满足这个需求。效果如下原创 2022-03-15 11:49:09 · 8061 阅读 · 2 评论 -
一种基于FBO实现渲染流水线的思路
假如我希望实现如下特性:1、使用片元shader,把YUV信号作为纹理输入,采样过程中转换为RGB信号。2、把第1步取得的画面通过片元shader,使用3*3的卷积核,实现卷积模糊。那么,就有如下几种方案:第一种:片元shader每次采样3*3个坐标,转换后记录到数组,之后对数组实现卷积处理,最后输出片元颜色。第二种:片元shader每次采样1个坐标,转换后直接输出到片元颜色,此时采样后的输出就会在指定的frameBuffer中。然后第二个片元shader使用framebuf原创 2022-03-11 16:40:09 · 1143 阅读 · 0 评论 -
关于过往OpenGL ES学习过程里面,对顶点变换操作性能的一些反思
我之前做顶点变换的时候,是使用CPU进行矩阵运算之后(物体变换矩阵 * 摄像机矩阵 * 投影矩阵):再把总变换矩阵送到顶点渲染器,物体实际顶点乘以它,就得到最终顶点。然后把它交给gl_Position摆好对应顶点即可:但是今天看LearnOpenGL CN的处理手法,我觉得是更能充分使用GPU的性能:整个矩阵乘法操作完全在顶端渲染器里面完成,可以更充分利用GPU的特性。...原创 2022-03-06 15:49:39 · 168 阅读 · 0 评论 -
关于实现视频剪辑软件流畅拖动预览方式的猜测
分情况讨论:一、快速粗略拖动:1、以10ms为一个时间单位,若在时间轴拖动时超过一定阈值(例如超过1个GOP),则仅显示GOP的关键帧(I帧),并且先试从映射表中找数据,如果找不到再进行解码。因为即使渲染出B、P帧,人眼也无法来得及看清,不如直接显示I帧来得实际。并把已经渲染过的I帧放到<pts,帧>的映射表中。1.1、若GOP长度超过一定时间阈值,则依然需要在阈值时间点中渲染对应位置的图像,以防快速拖动长距离时,本应出现图像变化时却并不出现图像变化。...原创 2022-01-31 20:18:37 · 670 阅读 · 0 评论 -
一种图片选择自定义控件
最后Demo效果如下:图片选择条https://www.bilibili.com/video/BV1SL4y1J792?share_source=copy_web之前视觉有一个需求,大概是这个样子:下面是待选择图片的选择条,移动小图到中间白框即为选中该图片,上面是选择了对应条目后要呈现的大图。松手时小图自动对齐白框位置,充满白框。功能分析:1、松手时小图自动对齐白框位置,充满白框:这个功能可以是使用ValueAnimator解决,设置目标值为view宽度 / 2,并找到当前距原创 2021-12-19 22:02:30 · 233 阅读 · 0 评论 -
OpenGL贴图保持原比例的一种方法
例如我创建了一个全屏的纹理顶点,但图片不一定是刚好符合屏幕比例的,这样纹理贴图一贴上去,一拉伸就不符合图片比例了,会比较难看,那么对顶点做怎样的临时变换可以维持渲染的图片保持比例呢? 我的基本环境设置如下:glViewport(0, 0, w, h);//设置视口float ratio = (float) h / w; frustumM(mProjMatrix, 0, -1, 1, -ratio, ratio, 1, 50);//设置投影矩阵投影矩阵设置方法:voi...原创 2021-12-07 20:06:07 · 1645 阅读 · 0 评论 -
自定义View——点击冒泡效果
一、目标:实现点击“喜欢”按钮时有向上飘逸的气泡效果。如图所示:二、核心规律分析:飘动效果近似于sin函数的活动规律,但为了飘动比较自然,需要引入随机变量。因此我决定把w设置180,加随机波动180;相位为[0, 90]范围内的随机值;振幅为[0, mWidth / 2]的随机值(mWidth为控件的宽度)。并且创建ValueAnimator,duration设置为[2100, 2800]内随机波动。最后可以得到随y从小到大变化的随机x飘动规律为:其中,curVal / 100f用于原创 2021-11-11 20:01:51 · 1865 阅读 · 0 评论 -
使用OpenGL纹理数组实现高精度实时Lut滤镜
之前写过的文章,我把一整个Lut滤镜图作为单个纹理贴图,把图像原颜色采样后当作坐标,然后从lut纹理中查找出替换颜色实现滤镜功能,这是最简易的一种滤镜实现方式,但由于lut纹理的T轴占比过长,计算进度上容易导致命中错误的滤镜页的问题,那是否有办法实现更高精度的滤镜呢?其实是有的,而且我优化了一下。本文默认读者已经具备基本的OpenGL代码阅读能力,所以只打算写一些必要的代码和解析。一、片元渲染器的编写:首先我们明确需要两个纹理,一个为原图纹理sTexture,用于给OpenGL灌入原画面原创 2021-09-28 17:04:20 · 1130 阅读 · 0 评论 -
自定义图片裁剪框
我最终实现的效果:Record几条规则:0、宽比高数值大时裁剪框为方形,高比宽数字大时为垂直于导航栏的长方形1、选中部分使用原亮度(或者透明度),非选中部分使用半透明2、需要具备拖动、缩放功能除了第三条需要一点空间想象力外,其余功能的实现都可以通过canvas + path + paint组合拳进行实现,不算难。与其花时间从GitHub上找到同款然后修改大量代码,我觉得不如直接自己使用基本模块实现来得灵活,而且自己写的东西,需求怎么变都可以快速添加新特性或进行修改,那么就开始直原创 2021-09-23 17:06:22 · 397 阅读 · 0 评论 -
给OES纹理添加雪花特效
uniform mat4 uMVPMatrix; //旋转平移缩放 总变换矩阵。物体矩阵乘以它即可产生变换 attribute vec3 objectPosition; //物体位置向量,参与运算但不输出给片源 attribute vec4 objectColor; //物理颜色向量 attribute vec2 vTexCoord; //纹理内坐标 varying vec4 frag...原创 2021-09-06 21:39:03 · 354 阅读 · 0 评论 -
OpenGL ES 3.0使用OES纹理闪退
打log发现出错信息如下:按照错误提示,把片元渲染器脚本的扩展特性声明从GL_OES_EGL_image_external改为GL_OES_EGL_image_external_essl3后运行不再闪退:原创 2021-07-16 11:52:00 · 471 阅读 · 0 评论 -
使用PBO更新NV21纹理,shader处理并渲染到FBO中,再进行二次渲染的例子
使用PBO对比glTexImage2d函数可以提升纹理更新效率,因为glTexImage2d更新纹理需要把内存数据复制到显存,而这完全由CPU进行操作:但使用PBO则可以让显卡驱动利用DMA通道,绕开CPU直接从指定的内存位置拷贝数据:使用两个PBO则可以进行异步更新进一步提升效能,例如一个在写的同时另外一个可以读:但PBO也仅仅是通过DMA提升纹理更新效率,因此纹理还是要创建的,我们先创建Y通道和UV通道两个只占用显存空间但内存全为0的纹理。双PBO + 双FBO架构如下:.原创 2021-06-29 21:14:18 · 1345 阅读 · 0 评论 -
几种常见GL ERROR含义
glError 0x506: 检查FrameBuffer有效性;glError 0x501: 检查上下文环境、program等对象索引是否正确;glError 0x502:检查传入的参数数据是否正确(顶点数据等);原创 2021-06-29 11:23:44 · 3795 阅读 · 0 评论 -
在安卓下用C写OpenGL代码
首先app的gradle要添加cmkae支持:重点代码如下: defaultConfig { …… externalNativeBuild { cmake { cppFlags "" } } ndk { abiFilters "armeabi-v7a", "arm64-v8a", "x86", "x86_64"原创 2021-06-26 22:01:29 · 804 阅读 · 1 评论 -
使用两个FBO互相绑定实现PS液化效果
之前想到在fragShader中使用纹理采样圈编写各种想法可以实现各种图片扭曲效果,而且是完全基于GPU不需要一丁点GPU的,性能非常高,但如果每次都用图片纹理绑定上去,那么每帧只有目标值会产生效果,无法使...原创 2021-06-20 20:22:49 · 828 阅读 · 7 评论 -
一种显示2d波浪动画的片元着色器代码
#version 300 esprecision highp float;uniform sampler2D sTexture;//纹理输入uniform int funChoice;uniform float frame;//第几帧uniform vec2 resolution;//分辨率in vec4 fragObjectColor;//接收vertShader处理后的颜色值给片元程序in vec2 fragVTexCoord;//接收vertShader处理后的纹理内坐标给片元程序o.原创 2021-06-12 22:50:01 · 190 阅读 · 0 评论 -
使用OpenGL实现滤镜转换的一种思路
这儿定义的滤镜是一种表,输入源的每像素颜色,也就是RGB共256*256*256那么多种颜色,每种都能在滤镜表中找到一个替换色,从而实现画面观感的改变。这里是一张滤镜表(64*64*64):在OpenGL中,纹理颜色的定位规则和通常的数组操作不同。纹理无论宽高比例如何,有多长,有多宽,都是长为1,宽为1的一个对象,要定位纹理某个位置的颜色,需要使用比例的方式。所以,在这里,RGB三个通道中,R控制可以去到纵向的第几面,这儿有64面,即整个纵向可以分为64份,第一分为0,最后一份为63,即原创 2020-12-28 21:25:40 · 546 阅读 · 0 评论 -
总结一下之前通过升维数据结构的方式提高Android Path擦除速度的思路心得
如图:[外链图片转存中…(img-yX8iGNm4-1608307271542)]在白板应用中,为了在擦除后保持线条的矢量特性,之前的算法是:0 从线条第一个坐标开始,记录该坐标为start,遍历该坐标,判断是否和矩形相交。1 如果相交,则当前遍历点为end,start到end重新构成一条线条。2 继续遍历原线条,找到不相交点,记录为start,...原创 2020-12-19 00:25:58 · 419 阅读 · 3 评论 -
YUV420(NV21或NV12)图像任意角度旋转的推导
一、坐标旋转:假设我要沿着图像M的中心旋转角度b,那么需要先将图像M的中心移动到与坐标轴中心重合(否则将导致图像M沿坐标轴原点旋转):然后假设原坐标(x,y)距离坐标轴原点距离为r,与x轴夹角a度,需要绕原点旋转b度,那么可有如下推导:设宽高分别为w,h原坐标为:x = r * cos(a)y = r * sin(a)新坐标为x_new = r * cos(a+b) = r*cos(a)*cos(b) - r*sin(a)*sin(b)=(x-w/2)*cos(.原创 2021-01-13 21:25:30 · 1424 阅读 · 0 评论 -
java通过三角函数旋转矩阵3_进一步提升速度的同时提升画质
https://blog.csdn.net/cjzjolly/article/details/109659319接上文《java通过三角函数旋转矩阵2_提升速度》通过上文我们不难发现实际上转换过后的矩阵,每行的斜率都是一样的,所以只要知道第一行起点和终点、最后一行的起点去终点,即可计算每行的起始x对比上一行要偏移的值ddx,另外也可以计算每行偏移的值ddy,即可优化出方法,这样只需计算一次三角函数和一次线条坐标,即可每次通过简单的偏移值累加就可以实现求得所有新的坐标值的目的: publi原创 2020-12-01 19:29:18 · 77 阅读 · 1 评论 -
java通过三角函数旋转矩阵2_提升速度
结合文章https://www.cnblogs.com/wlzy/p/8695226.html《Bresenham直线算法与画圆算法》优化循环,使得每行只有开始的坐标和结束的坐标被三角函数计算过,其余则通过Bresenham算法直接算出线条离散值,减少浮点运算负担。新增方法: // Bresenham's line algorithm private int[][] drawLine(int x1, int y1, int x2, int y2, int length) { //c.原创 2020-11-12 21:46:55 · 84 阅读 · 1 评论 -
java通过三角函数旋转矩阵(有失真)
根据直角坐标系绕原点旋转的原理(可参考https://www.jianshu.com/p/c83f59613c18也可以自己推),假定矩阵的左上角均在原点,那么想一个矩阵绕某个指定坐标旋转而不是原点旋转,可以通过给定的旋转坐标值反向偏移即可。即得方法,通过控制符号,即可产生逆时针旋转或者顺时针旋转,即参数ccw: /**@param centerPointX Rotate according to center pointX * @param centerPointY Rotate a原创 2020-11-11 19:39:11 · 105 阅读 · 2 评论 -
通过RenderScript 实现 NV21转Bitmap、两张Bitmap按照透明度混合的工具类
之前写的一篇文章中我通过提取bitmap的数组,然后通过位移运算提取两个数组的alpha值通过比例混合为一张新的图片,这样对于大图片来说会很卡。所以我在查阅资料后:安卓开发手册 ScriptIntrinsicBlend通过RenderScript使用GPU加速来获得非常好的转换效果,只要使用安卓自身提供的脚本工具类ScriptIntrinsicBlend,配置好参数和输入输出,还有混合模式,即可快速完成该任务。4k×2k的两张Bitmap可以在我的手机上只要30ms就可以混合完成。下面贴出我写的原创 2021-01-08 14:19:37 · 548 阅读 · 0 评论