Android GPUImage-13: Sepia

该代码示例展示了如何使用OpenGL着色器进行图像锐化处理。通过对中心像素和周围像素的不同权重计算,调整sharpness参数可以增强图像边缘,实现锐化效果。输入包括纹理坐标、图像宽度和高度因子以及锐度值。

1.效果图

2.shader

"attribute vec4 position;\n" +
            "attribute vec4 inputTextureCoordinate;\n" +
            "\n" +
            "uniform float imageWidthFactor; \n" +
            "uniform float imageHeightFactor; \n" +
            "uniform float sharpness;\n" +
            "\n" +
            "varying vec2 textureCoordinate;\n" +
            "varying vec2 leftTextureCoordinate;\n" +
            "varying vec2 rightTextureCoordinate; \n" +
            "varying vec2 topTextureCoordinate;\n" +
            "varying vec2 bottomTextureCoordinate;\n" +
            "\n" +
            "varying float centerMultiplier;\n" +
            "varying float edgeMultiplier;\n" +
            "\n" +
            "void main()\n" +
            "{\n" +
            "    gl_Position = position;\n" +
            "    \n" +
            "    mediump vec2 widthStep = vec2(imageWidthFactor, 0.0);\n" +
            "    mediump vec2 heightStep = vec2(0.0, imageHeightFactor);\n" +
            "    \n" +
            "    textureCoordinate = inputTextureCoordinate.xy;\n" +
            "    leftTextureCoordinate = inputTextureCoordinate.xy - widthStep;\n" +
            "    rightTextureCoordinate = inputTextureCoordinate.xy + widthStep;\n" +
            "    topTextureCoordinate = inputTextureCoordinate.xy + heightStep;     \n" +
            "    bottomTextureCoordinate = inputTextureCoordinate.xy - heightStep;\n" +
            "    \n" +
            "    centerMultiplier = 1.0 + 4.0 * sharpness;\n" +
            "    edgeMultiplier = sharpness;\n" +
            "}";

 

static final String SHARPEN_FRAGMENT_SHADER = "" +
            "precision highp float;\n" +
            "\n" +
            "varying highp vec2 textureCoordinate;\n" +
            "varying highp vec2 leftTextureCoordinate;\n" +
            "varying highp vec2 rightTextureCoordinate; \n" +
            "varying highp vec2 topTextureCoordinate;\n" +
            "varying highp vec2 bottomTextureCoordinate;\n" +
            "\n" +
            "varying highp float centerMultiplier;\n" +
            "varying highp float edgeMultiplier;\n" +
            "\n" +
            "uniform sampler2D inputImageTexture;\n" +
            "\n" +
            "void main()\n" +
            "{\n" +
            "    mediump vec3 textureColor = texture2D(inputImageTexture, textureCoordinate).rgb;\n" +
            "    mediump vec3 leftTextureColor = texture2D(inputImageTexture, leftTextureCoordinate).rgb;\n" +
            "    mediump vec3 rightTextureColor = texture2D(inputImageTexture, rightTextureCoordinate).rgb;\n" +
            "    mediump vec3 topTextureColor = texture2D(inputImageTexture, topTextureCoordinate).rgb;\n" +
            "    mediump vec3 bottomTextureColor = texture2D(inputImageTexture, bottomTextureCoordinate).rgb;\n" +
            "\n" +
            "    gl_FragColor = vec4((textureColor * centerMultiplier - (leftTextureColor * edgeMultiplier + rightTextureColor * edgeMultiplier + topTextureColor * edgeMultiplier + bottomTextureColor * edgeMultiplier)), texture2D(inputImageTexture, bottomTextureCoordinate).w);\n" +
            "}";

3.原理

取上下左右四个点,把中心点的像素按照一定的sharpness来改变,临近的像素是比较相似的。

<section id="min2" class="min2"> <div class="min2-container"> <!-- 左侧装饰图片 --> <div class="decor-image left-image"> <img src="mmexport1747721578359.jpg" alt="大吉大利"> <div class="image-caption">大吉大利 · 吉祥如意</div> </div> <!-- 左侧按钮 --> <div class="button-group"> <button class="nav-btn active">按钮1</button> <button class="nav-btn">按钮2</button> <button class="nav-btn">按钮3</button> <button class="nav-btn">按钮4</button> <button class="nav-btn">按钮5</button> </div> <!-- 右侧内容 --> <div class="content-group"> <div class="content-item active">内容1</div> <div class="content-item">内容2</div> <div class="content-item">内容3</div> <div class="content-item">内容4</div> <div class="content-item">内容5</div> </div> <!-- 右侧装饰图片 --> <div class="decor-image right-image"> <img src="Camera_XHS_17477284562331000g0082eqimhaggm02g49u1gpa8c889nq10qb0_edit_1256640406762938.jpg" alt="好事发生"> <div class="image-caption">好事发生 · 好事连连</div> </div> </div> </section> <style> .min2 { background-color: aquamarine; height: 700px; display: flex; align-items: center; justify-content: center; overflow: auto; position: relative; } .min2-container { display: flex; gap: 2rem; max-width: 1400px; /* 增加最大宽度容纳图片 */ width: 100%; margin: 0 auto; padding: 20px; align-items: start; position: relative; z-index: 2; } /* 装饰图片样式 */ .decor-image { width: 180px; display: flex; flex-direction: column; align-items: center; position: relative; transition: all 0.3s ease; } .decor-image img { width: 100%; height: auto; border-radius: 12px; box-shadow: 0 8px 20px rgba(0, 0, 0, 0.15); object-fit: cover; aspect-ratio: 3/4; filter: sepia(15%) brightness(105%) contrast(105%); border: 3px solid rgba(255, 255, 255, 0.8); } .image-caption { margin-top: 15px; font-size: 16px; font-weight: 600; color: #5a3e2b; text-align: center; font-family: 'SimSun', serif; letter-spacing: 1px; background: rgba(255, 255, 255, 0.7); padding: 5px 10px; border-radius: 20px; } .left-image { margin-right: 20px; transform: rotate(-5deg); } .right-image { margin-left: 20px; transform: rotate(5deg); } .left-image:hover, .right-image:hover { transform: rotate(0deg) scale(1.05); } /* 按钮组样式调整 */ .button-group { width: 200px; margin: 0 10px; } /* 内容区域样式调整 */ .content-group { flex: 1; max-width: 600px; } /* 背景装饰元素 */ .min2::before { content: ""; position: absolute; top: 0; left: 0; right: 0; bottom: 0; background: url('mmexport1747721578359.jpg') left 10% center/contain no-repeat, url('Camera_XHS_17477284562331000g0082eqimhaggm02g49u1gpa8c889nq10qb0_edit_1256640406762938.jpg') right 10% center/contain no-repeat; opacity: 0.1; z-index: 1; } /* 保持原有的按钮和内容样式不变 */ .nav-btn { padding: 15px 25px; border: none; border-radius: 8px; background: #CC3333; cursor: pointer; transition: all 0.3s; text-align: left; font-size: 16px; color: burlywood; } .nav-btn:hover { background: #A52A2A; } .nav-btn.active { background: #8B0000; color: white; transform: translateX(10px); } .content-item { display: none; padding: 30px; background: rgba(255, 255, 255, 0.9); border-radius: 12px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.1); min-height: 400px; backdrop-filter: blur(5px); border: 1px solid rgba(255, 255, 255, 0.3); } .content-item.active { display: block; animation: fadeIn 0.5s; } @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } </style>显示出网页结果
最新发布
05-21
### 如何在浏览器中预览HTML和CSS代码 要在浏览器中预览HTML和CSS代码的效果,可以通过以下方法实现: #### 方法一:本地文件打开 将HTML和CSS代码保存到本地计算机上的相应文件中。创建两个文件:一个是`.html`扩展名的HTML文件,另一个是`.css`扩展名的CSS文件。 以下是示例代码结构: ```html <!-- index.html --> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="styles.css"> <!-- 链接外部CSS文件 --> </head> <body> <div class="control"></div> <div class="car"></div> <div class="position"></div> <div class="zoom-in"></div> <div class="zoom-out"></div> </body> </html> ``` ```css /* styles.css */ .control { display: block; text-decoration: none; padding: 0; width: 30px; height: 30px; } .car, .position, .zoom-in, .zoom-out { display: block; width: 100%; height: 100%; background: url('images/map-icon.png') no-repeat; } .car { background-position: 0 0; } .position { background-position: -30px 0; } .zoom-in { background-position: -60px 0; } .zoom-out { background-position: -90px 0; } ``` 完成文件编写后,在操作系统中双击HTML文件即可通过默认浏览器打开并查看效果[^1]。 --- #### 方法二:在线工具实时预览 如果不想配置本地环境,也可以使用一些在线平台快速测试HTML和CSS代码。这些工具允许用户直接输入代码并即时看到渲染结果。常见的工具有CodePen、JSFiddle 或 CodeSandbox等。 例如,在CodePen中可以直接粘贴如下代码片段进行测试: ```html <div class="control"></div> <div class="car"></div> <div class="position"></div> <div class="zoom-in"></div> <div class="zoom-out"></div> ``` ```css .control { display: block; text-decoration: none; padding: 0; width: 30px; height: 30px; } .car, .position, .zoom-in, .zoom-out { display: block; width: 100%; height: 100%; background: url('https://example.com/images/map-icon.png') no-repeat; /* 替换为实际路径 */ } .car { background-position: 0 0; } .position { background-position: -30px 0; } .zoom-in { background-position: -60px 0; } .zoom-out { background-position: -90px 0; } ``` 这种方法适合初学者或临时验证某些功能时使用[^2]。 --- #### 方法三:开发者工具调试模式 对于已经运行于服务器端或者静态托管服务(如GitHub Pages)上的项目,可以利用现代浏览器内置的开发者工具来动态修改HTML/CSS内容,并立即观察变化情况。 按下键盘快捷键 `F12` 或右键点击页面空白处选择“检查”,进入开发者工具界面。在此界面上找到对应的HTML节点及其关联样式表项加以调整试验[^3]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值