马赛克处理

去取马赛克的网址:

Redact • Photo - Free And Private Image Redaction In The Browser

https://redact.photo/

REDACT.PHOTO  (照片马赛克处理在线工具)简介
REDACT.PHOTO是一个照片马赛克处理在线工具,能够帮助我们非常方便的为照片搭上马赛克,并且完全免费,而且该在线工具采用的马赛克是随机排列,所以不容易破解,而且还具有快速裁剪图片的功能,简单好用!

提供随机排列的马赛克,让别人难以破解。
可快速裁剪、旋转、镜像与编辑图像。
REDACT.PHOTO  (照片马赛克处理在线工具)官网及使用教程
官网:https://redact.photo/
1、点击上面的官网链接打开该在线工具;


2、打开该在线工具后如上图所示,我们点击“Select Photo”来上传需要编辑处理的的图片或照片;

 

 

3、上传图片完成后如上图所示,我们点击图示标注1所示的马赛克功能键,就能为图片打马赛克了,通过点击图示标注2所示的图片裁剪功能,我们还可以对图片进行裁剪编辑。

马赛克处理编辑完成后,点击“Export”就能下载并导出编辑好的图片照片了。

REDACT.PHOTO – 照片马赛克处理在线工具(含教程)-科技师

Video Enhancer 是一款提升视频质量的软件。采用大量的VirtualDub滤镜和附加的编码器重新压缩的视频处理,将马赛克进行还原。 您可通过使用 Video Enhancer 强加您视频的分辨率以极大的提升其品质,它可以调用绝大多数 VirtualDub 滤镜及任意编解码器进行重压缩处理。 Video Enhancer (视频马赛克还原) 使用说明: 1、启动Video Enhancer,进入Video Enhancer的主界面 2、在输入视频文件的右下方有一个浏览按钮,点击浏览,选择要处理的视频 3、在浏览的下面有一个多文件,意思是Video Enhancer可以同时处理多个视频文件,单击多文件,添加其它要处理的文件4、单击添加,选择其它的要处理的文件,然后单击确定,回到主界面: 5、接下来有一个超分辨率模式,如果你的电脑配置还行的话,选择上面的质量优先模式,否则选择下面的速度优先。这是视频处理过程的不同插值计算方法。 6、在输出文件的右下面的浏览,是让你选择处理好的文件存放路径,最好选择一个空间比较大的地方,因为输出的AVI占用磁盘空间比较大,具体要看不同的编码。 7、再下面的帧大小就是分辨率的设置,不同的文件需求,要设置不同大小。注意要设定合适的比例,否则画面会变形的,如果你不知道比率,可以使用高级模式(主界面的右边部分,左边下面的简单模式与高级模式转换按钮),选择超分辨率,有一个;保持纵横比,勾选。 看到红色矩形框框住的吗?选择它。 9、选定后,单击右边的配置,encode表示编码,也就是视频处理符合什么标准,下面是你可以选择的标准:是你处理好的视频用播放器播放,需要什么解码器。mode指的是压缩模式,使用恒定比率还是使用其它的方式。我们选择第一个恒定比率,下面就会出现比特率的设置,bitrate就是比特率的意思。 10、设置好后,再进行音频设置,根据你对音频的要求,选择相应的声音品质。 11、Video Enhancer的功能强大还在于有很多相关的VD滤镜,进入到高级模式中就会有很多滤镜,只要选择VD滤镜,就会出现滤镜选项,这些设置好后,就可点开始了。
以下是一个简单的OpenGL ES马赛克处理的例子代码: ```c #include <GLES2/gl2.h> // 马赛克处理的像素数 #define MOSAIC_SIZE 10 // 顶点着色器代码 const char* vertexShaderCode = "attribute vec4 a_Position;\n" "void main() {\n" " gl_Position = a_Position;\n" "}\n"; // 片段着色器代码 const char* fragmentShaderCode = "precision mediump float;\n" "uniform sampler2D u_Texture;\n" "uniform vec2 u_MosaicSize;\n" "varying vec2 v_TexCoord;\n" "void main() {\n" " vec2 mosaicCoord = vec2(floor(v_TexCoord.x / u_MosaicSize.x), floor(v_TexCoord.y / u_MosaicSize.y));\n" " vec2 mosaicTexCoord = vec2(mosaicCoord.x * u_MosaicSize.x, mosaicCoord.y * u_MosaicSize.y);\n" " gl_FragColor = texture2D(u_Texture, mosaicTexCoord);\n" "}\n"; // 顶点坐标数据 GLfloat vertices[] = { -1.0f, 1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, }; // 纹理坐标数据 GLfloat texCoords[] = { 0.0f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f, }; // 坐标索引数据 GLushort indices[] = {0, 1, 2, 0, 2, 3}; // 纹理ID GLuint textureId; // 着色器程序ID GLuint programId; void initTexture() { // 创建纹理 glGenTextures(1, &textureId); glBindTexture(GL_TEXTURE_2D, textureId); // 设置纹理参数 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); // 加载图片并设置纹理数据 int width, height, channels; unsigned char* image = stbi_load("image.png", &width, &height, &channels, STBI_rgb_alpha); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image); stbi_image_free(image); } void initShader() { // 创建顶点着色器对象 GLuint vertexShaderId = glCreateShader(GL_VERTEX_SHADER); glShaderSource(vertexShaderId, 1, &vertexShaderCode, nullptr); glCompileShader(vertexShaderId); // 创建片段着色器对象 GLuint fragmentShaderId = glCreateShader(GL_FRAGMENT_SHADER); glShaderSource(fragmentShaderId, 1, &fragmentShaderCode, nullptr); glCompileShader(fragmentShaderId); // 创建着色器程序对象 programId = glCreateProgram(); glAttachShader(programId, vertexShaderId); glAttachShader(programId, fragmentShaderId); glBindAttribLocation(programId, 0, "a_Position"); glBindAttribLocation(programId, 1, "a_TexCoord"); glLinkProgram(programId); // 获取uniform变量的位置 GLint mosaicSizeLocation = glGetUniformLocation(programId, "u_MosaicSize"); // 设置uniform变量的值 glUniform2f(mosaicSizeLocation, MOSAIC_SIZE, MOSAIC_SIZE); } void initVertexBuffer() { // 创建顶点缓冲区对象 GLuint vertexBufferId; glGenBuffers(1, &vertexBufferId); glBindBuffer(GL_ARRAY_BUFFER, vertexBufferId); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); // 创建纹理坐标缓冲区对象 GLuint texCoordBufferId; glGenBuffers(1, &texCoordBufferId); glBindBuffer(GL_ARRAY_BUFFER, texCoordBufferId); glBufferData(GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW); // 创建索引缓冲区对象 GLuint indexBufferId; glGenBuffers(1, &indexBufferId); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indexBufferId); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices), indices, GL_STATIC_DRAW); // 设置顶点属性指针 GLuint positionLocation = glGetAttribLocation(programId, "a_Position"); glEnableVertexAttribArray(positionLocation); glBindBuffer(GL_ARRAY_BUFFER, vertexBufferId); glVertexAttribPointer(positionLocation, 2, GL_FLOAT, GL_FALSE, 0, nullptr); // 设置纹理坐标属性指针 GLuint texCoordLocation = glGetAttribLocation(programId, "a_TexCoord"); glEnableVertexAttribArray(texCoordLocation); glBindBuffer(GL_ARRAY_BUFFER, texCoordBufferId); glVertexAttribPointer(texCoordLocation, 2, GL_FLOAT, GL_FALSE, 0, nullptr); } void render() { // 清空颜色缓冲区 glClear(GL_COLOR_BUFFER_BIT); // 绑定纹理 glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, textureId); // 绘制矩形 glUseProgram(programId); glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, nullptr); } int main() { // 初始化OpenGL ES上下文 // 初始化纹理 initTexture(); // 初始化着色器程序 initShader(); // 初始化顶点缓冲区 initVertexBuffer(); // 渲染场景 render(); return 0; } ``` 在片段着色器中,我们使用了一个uniform变量`u_MosaicSize`来表示马赛克处理的像素数,计算出当前像素所在的马赛克块的坐标,然后再根据马赛克块的坐标计算出当前像素在马赛克块中的坐标,最后使用该坐标取纹理颜色,从而实现马赛克处理。在初始化着色器程序时,我们使用`glUniform2f`函数将`u_MosaicSize`的值设置为`MOSAIC_SIZE`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值