图像处理
文章平均质量分 53
cjzcjl
客户端一片哀嚎……
展开
-
GL绘制自定义线条4_使用OpenGL ES实现钢笔效果
这个练字核心掌握了,你就离一手好字不远了!,顶级英语作文书写四大特征,照着练,通过PBO保存当前绑定的FrameBuffer画面,王炸!AI声音克隆+Sora开源平替一键启动,全网最简单!那么每个微分的位置,它的两个连接点都会构成一个向量,通过这个向量可以获取到每一个微分的部位相对于初始端点的旋转量。使用OpenGL ES实现压感笔书写适配_哔哩哔哩_bilibili。平滑,即可得到随压力值平滑过度的书写曲线了,就像钢笔写的一样。【使用OpenGL ES实现压感笔书写适配】依靠向量方向生成端点。原创 2024-02-29 21:56:57 · 465 阅读 · 0 评论 -
Android开发经验记录_对多个Path形成的图形进行填充踩坑与怕坑记录
网络上大部分文章都是描写单个Path如何进行颜色填充,没有描写多个Path组合起来如何正确填充颜色,我自己摸索了一个比较合理的形式。原创 2023-12-13 15:52:18 · 140 阅读 · 0 评论 -
GL绘制自定义线条3_自定义线帽
在安卓中使用OpenGL绘制如Path+Paint一样效果的书写线条,并附带笔帽效果实现原创 2023-05-15 11:57:35 · 596 阅读 · 1 评论 -
GL绘制自定义样式线条
使用OpenGL绘制自定义曲线的原理推导和粗略实现原创 2023-05-06 11:13:09 · 199 阅读 · 0 评论 -
GL绘制自定义线条2_手写曲线应用贝塞尔曲线
假定我现在有3个顶点(P0、P1、P2),想以曲线的方式进行绘制其路径,那么可以从P0到P1、P1到P2两个线段,按照同样的百分比步进量,沿着这两个线段对应百分比的位置连接为一个新的线段(图中绿色部分),然后取这个线段同样百分比位置的坐标,将这些坐标连城线即可得到一端曲线。上一篇文章的曲线是由触摸点直接生成的,但触摸点并非连续的,而是离散的,而且屏幕触摸点采样的间隔时间其实不短,因此如果单纯只用触摸点生成OpenGL触摸曲线,在高速书写时会导致曲线看起来就像多个线段合起来一样(事实也是如此)。原创 2023-05-08 21:52:55 · 600 阅读 · 0 评论 -
再说fragshader特效_膨胀效果的数学推导
PS中的液化功能中的膨胀效果在fragshader实现时的数学推导过程原创 2023-03-15 22:40:34 · 331 阅读 · 0 评论 -
JPEG图像压缩探索_zigzag扫描(原创)
在DCT图像变换完成后,需要把数据从高频到低频频域强度信号进行筛选等操作,为了方便算法进行操作,最好转化为一个一维的数据。本文介绍适合从左上到右下将数据转化为一维数据的方法以及个人实现。原创 2023-02-22 10:54:08 · 1067 阅读 · 0 评论 -
透视投影的一些简短推导
投射投影规律的简单总结,通过眼球模型开展。原创 2022-12-11 22:26:15 · 400 阅读 · 0 评论 -
使用两个FBO互相绑定实现PS液化效果(2)_使用PBO保存FBO当前画面
使用PBO保存当前FrameBuffer的帧原创 2022-09-08 00:08:06 · 231 阅读 · 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 · 283 阅读 · 1 评论 -
创造一款安卓自定义控件_任意4顶点裁剪框
最终效果:一种可以不规则截取图片的自定义控件规则描述:1、 要有三点之间构成了两个线段所组成的角度判断能力,不允许超过180度的角度出现,以免导致出现凹进去的形状。2、不允许构成线段的端点两年交换导致线条出现相交。实际构成:1、裁剪框由4个端点所组成,在这里我使用了顺时针的方向排布了这4个点。2、对规则1的实施,使用了代码:其中first到middle是第一条线段端点,middle到end是第二条线条的端点: private double lin原创 2022-04-24 23:07:36 · 690 阅读 · 4 评论 -
二维旋转的实质的直观理解
以旋转90度为例,把指针拆分成x和y两个分量,可以发现随着旋转角度的增大,x和y分量所产生的周期波形刚好有90度的相位差,当一方最大时另一方最小,因此才会有旋转公式:原创 2022-04-18 21:15:39 · 237 阅读 · 0 评论 -
PDF reference 学习笔记
原创 2022-04-12 23:28:19 · 518 阅读 · 0 评论 -
JPEG图像压缩探索_DCT变换的应用
对于图像处理来说,细节部分一般具有亮度起伏大、较短的尺度下亮度变化次数多的特点,转换为数学方式的描述,就是图像细节部分一般为“高频信号”,因此,如果能使用“分频器”,把图像的“时域信号”转化为“频域信号”,即可实现筛选走一部分高频信号,只保留高频信号,使得表达图像时需要的空间减少。原创 2022-03-20 00:05:40 · 2813 阅读 · 1 评论 -
使用OES纹理+GLSurfaceView+JNI实现基于OpenGL ES的播放器画面处理
安卓使用SurfaceView + SurfaceTexture + Surface进行视频播放或者相机预览,只能看到原色画面,但很多场合需求画面可以实现二次加工,例如调整红绿蓝三原色的比例、添加滤镜、降噪等,此时如果使用GLSurfaceview搭配GL Shader Language进行基于GPU的实时处理,就可以又快又节能地满足这个需求。效果如下原创 2022-03-15 11:49:09 · 7693 阅读 · 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 · 1060 阅读 · 0 评论 -
关于过往OpenGL ES学习过程里面,对顶点变换操作性能的一些反思
我之前做顶点变换的时候,是使用CPU进行矩阵运算之后(物体变换矩阵 * 摄像机矩阵 * 投影矩阵):再把总变换矩阵送到顶点渲染器,物体实际顶点乘以它,就得到最终顶点。然后把它交给gl_Position摆好对应顶点即可:但是今天看LearnOpenGL CN的处理手法,我觉得是更能充分使用GPU的性能:整个矩阵乘法操作完全在顶端渲染器里面完成,可以更充分利用GPU的特性。...原创 2022-03-06 15:49:39 · 148 阅读 · 0 评论 -
关于实现视频剪辑软件流畅拖动预览方式的猜测
分情况讨论:一、快速粗略拖动:1、以10ms为一个时间单位,若在时间轴拖动时超过一定阈值(例如超过1个GOP),则仅显示GOP的关键帧(I帧),并且先试从映射表中找数据,如果找不到再进行解码。因为即使渲染出B、P帧,人眼也无法来得及看清,不如直接显示I帧来得实际。并把已经渲染过的I帧放到<pts,帧>的映射表中。1.1、若GOP长度超过一定时间阈值,则依然需要在阈值时间点中渲染对应位置的图像,以防快速拖动长距离时,本应出现图像变化时却并不出现图像变化。...原创 2022-01-31 20:18:37 · 623 阅读 · 0 评论 -
一种图片选择自定义控件
最后Demo效果如下:图片选择条https://www.bilibili.com/video/BV1SL4y1J792?share_source=copy_web之前视觉有一个需求,大概是这个样子:下面是待选择图片的选择条,移动小图到中间白框即为选中该图片,上面是选择了对应条目后要呈现的大图。松手时小图自动对齐白框位置,充满白框。功能分析:1、松手时小图自动对齐白框位置,充满白框:这个功能可以是使用ValueAnimator解决,设置目标值为view宽度 / 2,并找到当前距原创 2021-12-19 22:02:30 · 210 阅读 · 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 · 1374 阅读 · 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 · 1815 阅读 · 0 评论 -
使用OpenGL纹理数组实现高精度实时Lut滤镜
之前写过的文章,我把一整个Lut滤镜图作为单个纹理贴图,把图像原颜色采样后当作坐标,然后从lut纹理中查找出替换颜色实现滤镜功能,这是最简易的一种滤镜实现方式,但由于lut纹理的T轴占比过长,计算进度上容易导致命中错误的滤镜页的问题,那是否有办法实现更高精度的滤镜呢?其实是有的,而且我优化了一下。本文默认读者已经具备基本的OpenGL代码阅读能力,所以只打算写一些必要的代码和解析。一、片元渲染器的编写:首先我们明确需要两个纹理,一个为原图纹理sTexture,用于给OpenGL灌入原画面原创 2021-09-28 17:04:20 · 1035 阅读 · 0 评论 -
自定义图片裁剪框
我最终实现的效果:Record几条规则:0、宽比高数值大时裁剪框为方形,高比宽数字大时为垂直于导航栏的长方形1、选中部分使用原亮度(或者透明度),非选中部分使用半透明2、需要具备拖动、缩放功能除了第三条需要一点空间想象力外,其余功能的实现都可以通过canvas + path + paint组合拳进行实现,不算难。与其花时间从GitHub上找到同款然后修改大量代码,我觉得不如直接自己使用基本模块实现来得灵活,而且自己写的东西,需求怎么变都可以快速添加新特性或进行修改,那么就开始直原创 2021-09-23 17:06:22 · 331 阅读 · 0 评论 -
给OES纹理添加雪花特效
uniform mat4 uMVPMatrix; //旋转平移缩放 总变换矩阵。物体矩阵乘以它即可产生变换 attribute vec3 objectPosition; //物体位置向量,参与运算但不输出给片源 attribute vec4 objectColor; //物理颜色向量 attribute vec2 vTexCoord; //纹理内坐标 varying vec4 frag...原创 2021-09-06 21:39:03 · 321 阅读 · 0 评论 -
OpenGL ES 3.0使用OES纹理闪退
打log发现出错信息如下:按照错误提示,把片元渲染器脚本的扩展特性声明从GL_OES_EGL_image_external改为GL_OES_EGL_image_external_essl3后运行不再闪退:原创 2021-07-16 11:52:00 · 412 阅读 · 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 · 1149 阅读 · 0 评论 -
几种常见GL ERROR含义
glError 0x506: 检查FrameBuffer有效性;glError 0x501: 检查上下文环境、program等对象索引是否正确;glError 0x502:检查传入的参数数据是否正确(顶点数据等);原创 2021-06-29 11:23:44 · 3377 阅读 · 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 · 726 阅读 · 1 评论 -
使用两个FBO互相绑定实现PS液化效果
之前想到在fragShader中使用纹理采样圈编写各种想法可以实现各种图片扭曲效果,而且是完全基于GPU不需要一丁点GPU的,性能非常高,但如果每次都用图片纹理绑定上去,那么每帧只有目标值会产生效果,无法使...原创 2021-06-20 20:22:49 · 732 阅读 · 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 · 170 阅读 · 0 评论 -
使用OpenGL实现滤镜转换的一种思路
这儿定义的滤镜是一种表,输入源的每像素颜色,也就是RGB共256*256*256那么多种颜色,每种都能在滤镜表中找到一个替换色,从而实现画面观感的改变。这里是一张滤镜表(64*64*64):在OpenGL中,纹理颜色的定位规则和通常的数组操作不同。纹理无论宽高比例如何,有多长,有多宽,都是长为1,宽为1的一个对象,要定位纹理某个位置的颜色,需要使用比例的方式。所以,在这里,RGB三个通道中,R控制可以去到纵向的第几面,这儿有64面,即整个纵向可以分为64份,第一分为0,最后一份为63,即原创 2020-12-28 21:25:40 · 503 阅读 · 0 评论 -
总结一下之前通过升维数据结构的方式提高Android Path擦除速度的思路心得
如图:[外链图片转存中…(img-yX8iGNm4-1608307271542)]在白板应用中,为了在擦除后保持线条的矢量特性,之前的算法是:0 从线条第一个坐标开始,记录该坐标为start,遍历该坐标,判断是否和矩形相交。1 如果相交,则当前遍历点为end,start到end重新构成一条线条。2 继续遍历原线条,找到不相交点,记录为start,...原创 2020-12-19 00:25:58 · 384 阅读 · 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 · 1280 阅读 · 0 评论 -
通过RenderScript 实现 NV21转Bitmap、两张Bitmap按照透明度混合的工具类
之前写的一篇文章中我通过提取bitmap的数组,然后通过位移运算提取两个数组的alpha值通过比例混合为一张新的图片,这样对于大图片来说会很卡。所以我在查阅资料后:安卓开发手册 ScriptIntrinsicBlend通过RenderScript使用GPU加速来获得非常好的转换效果,只要使用安卓自身提供的脚本工具类ScriptIntrinsicBlend,配置好参数和输入输出,还有混合模式,即可快速完成该任务。4k×2k的两张Bitmap可以在我的手机上只要30ms就可以混合完成。下面贴出我写的原创 2021-01-08 14:19:37 · 512 阅读 · 0 评论 -
一种通过多线程快速插入ARGB到YUV图片的原创方法 C语言实现
利用之前写的颜色混合原理,在实现了ARGB转成YUV后,通过alpha值按比例混合原有的YUV值即可:颜色混合具体实现代码:fastYuvInsertBmp.c过程中我使用了一个循环做了个假的三色bmp,你可以用真的bmp代替进行测试。精华在那个双重循环里面,留个坑以后解释位置偏移原理:#include "stdio.h"#include "stdlib.h"#include "multiThread.c"#include <sys/time.h>struct p原创 2020-06-29 18:37:06 · 284 阅读 · 0 评论 -
一种基于自定义View的贴纸控件Demo
其实就是自定义一套触摸事件规则,加上对Matrix的使用即可。首先定义基类,首先不同类型的图元,例如Bitmap或者文本,需要的缩放、移动、测量、绘制方式可能都不一致,所以做成抽象函数顶个接口规范,等待子类自己实现:package com.chenjiezhu.waterMarkShape;import android.graphics.Canvas;import android.graphics.Paint;import android.graphics.PointF;import a原创 2020-06-18 19:10:57 · 327 阅读 · 1 评论 -
用2个字节或更少的字节表达RGB图像的可能性探索
昨晚睡之前想,如果总结一个Bitmap中含有的RGB值,然后如果最常用的颜色在3万种左右,那么可以统计为一个表,名为colorList,直接用把Bitmap中对应的像素替换为最接近的颜色的索引指,假设颜色表限制容量为最长出现的32767种,那么索引只需要两个字节即可表达;如果颜色表限制为最多256种颜色,最只需要1个字节的索引就可以替换1个像素,从而达到压缩作用。 ...原创 2020-01-17 14:24:43 · 931 阅读 · 1 评论 -
自定义控件——原创仿地图瓦片动态加载_阶段5_一种Excel类App的可能Demo
使用这种本控件,控件内部可以根据你的需要生成不同大小的Unit矩阵,并赋予每个矩阵单元一个tag,在移动到边界时将会回收再利用,tag也会根据移动时的情况更改值,你可以在tag被更新时加载内存或者外存的数据,刷新到Unit中,形成地图加载器或者Excel类软件,而且不会像之前用ImageView组成的矩阵那样,内部分辨率被固定住了。可以看效果,视频中格子只有20*20个,但是可以通过Un...原创 2019-10-31 17:59:39 · 227 阅读 · 0 评论 -
自定义控件——原创仿地图瓦片动态加载_阶段4_一种优化的可能Demo
由于用ImageView开销太大了,所以我准备用单个View继承出一个子类,直接重写onDraw来显示图块,这样还可以共享同一块位图进行平铺操作。打算未来用于白板上作为移动缩放的辅助类,提高移动缩放的效率,或者直接就取代普通的位图Canvas+SurfaceView的方式做白板程序。在每放大百分之10之后就加载分辨率更高的栅格化图片,更好的模仿地图的作用。代码如下:地图控件View:...原创 2019-10-30 12:07:06 · 408 阅读 · 1 评论 -
一个可旋转的OpenGL魔方实验(27个立方体作为一个大立方体)2_带线程动画的魔方
承接上文:一个可旋转的OpenGL魔方实验(27个立方体作为一个大立方体):https://blog.csdn.net/cjzjolly/article/details/101624806已知图层每层的排序顺序为:8 6 75 3 42 0 1因此可以添加一个线程,通过更加顶点坐标,重新创建Buffer,让某几个立方体产生位移的效果:然后主线程可以继续更换...原创 2019-09-29 11:47:38 · 493 阅读 · 0 评论