我在视频处理方面遇到了一些麻烦。我正在使用带有纹理的表面来处理带有 MediaCodec 和 MediaMuxer 的视频(解码、裁剪、以较低质量编码)。
在裁剪的中间步骤,我遇到了问题。基本上,我想做的是采用较小尺寸的视频,然后基于这一边,为较大的一面定义偏移量并将其裁剪掉。然后结果应适当缩放为 640x640 正方形。我搜索了相当多的时间,但我发现的所有信息都表明 Open GL 应该缩放图像本身。是的,我应该承认它做了一些缩放,但结果看起来很难看,它似乎很难垂直“压缩”。
所以,现在问题本身。有人可以向我提供一些解释,甚至是在 Open GL ES 中执行所需功能的代码 fragment 吗?
我已经尝试调整 Viewport 思想。
GLES20.glViewport(0, 0, 640, 640)
更新
Isogen74 提出的 more less 的想法对我有用。它仍然拉伸(stretch)得非常明显,但总比什么都没有好。
您可以在这里找到更新的代码:OpenGL setup
最佳答案
裁剪 - 加载纹理时更改加载的纹理坐标;例如如果您想将图像加载的顶部和底部裁剪 10%,从 (0.0, 0.1) 到 (1.0, 0.9)。
缩放 - 答案取决于您缩小到 640*640 的大小。 OpenGL 过滤并非设计用于直接处理较大的缩小比例 - 它不是图像处理库 - 但假设相对较小的缩放比例只需确保您已打开 GL_LINEAR 纹理过滤而不是 GL_NEAREST。
如果你有一个大的缩小,你可能需要先对纹理进行 mipmap,然后将 GL_LINEAR_MIPMAP_NEAREST 或 GL_LINEAR_MIPMAP_LINEAR 作为你的缩小过滤器,但请注意,这不会给你带来一些好的东西,例如适当的缩放算法您可能会使用图像处理软件(例如双三次或类似软件)。
关于Android、Open GL ES、裁剪和缩放纹理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37076363/