我试图在Android for OpenGL 2.0中获得最大的纹理大小限制.但是我发现只有当我在OpenGL上下文中时,下一条指令才有效,换句话说我必须有GL Surface和GL Renderer等,这是我不想要的.
int[] maxTextureSize = new int[1];
GLES20.glGetIntegerv(GLES20.GL_MAX_TEXTURE_SIZE, maxTextureSize, 0);
Run Code Online (Sandbox Code Playgroud)
所以我选择了下一个算法,它给了我最大的纹理大小,而不必创建任何表面或渲染器.它的工作正常,所以我的问题是,这是否适用于所有Android设备,如果有人能发现任何错误,以防万一.
public int getMaximumTextureSize()
{
EGL10 egl = (EGL10)EGLContext.getEGL();
EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY);
// Initialise
int[] version = new int[2];
egl.eglInitialize(display, version);
// Query total number of configurations
int[] totalConfigurations = new int[1];
egl.eglGetConfigs(display, null, 0, totalConfigurations);
// Query actual list configurations
EGLConfig[] configurationsList = new EGLConfig[totalConfigurations[0]];
egl.eglGetConfigs(display, configurationsList, totalConfigurations[0], totalConfigurations);
int[] textureSize = new int[1];
int maximumTextureSize = 0;
// Iterate through all the configurations …Run Code Online (Sandbox Code Playgroud) 我正在尝试找到一个简单的算法来裁剪(删除黑色区域)使用openCV Stitcher模块创建的全景图像.
我的想法是计算图像中最内部的黑点,它将定义裁剪区域,如下图所示:

预期的裁剪结果:

我已经尝试了接下来的两种方法,但它们没有按预期裁剪图像:
第一种方法:
void testCropA(cv::Mat& image)
{
cv::Mat gray;
cvtColor(image, gray, CV_BGR2GRAY);
Size size = gray.size();
int type = gray.type();
int left = 0, top = 0, right = size.width, bottom = size.height;
cv::Mat row_zeros = Mat::zeros(1, right, type);
cv::Mat col_zeros = Mat::zeros(bottom, 1, type);
while (countNonZero(gray.row(top) != row_zeros) == 0) { top++; }
while (countNonZero(gray.col(left) != col_zeros) == 0) { left++; }
while (countNonZero(gray.row(bottom-1) != row_zeros) == 0) { bottom--; }
while (countNonZero(gray.col(right-1) != col_zeros) == …Run Code Online (Sandbox Code Playgroud) 我正在尝试在片段着色器中旋转纹理,而不是使用顶点着色器和矩阵变换.
旋转的枢轴位于中心.
当在具有方形形状的四边形中渲染时,该算法工作正常,但是当四边形具有矩形形状时,渲染结果变得混乱.有谁能发现问题?
谢谢
varying vec2 v_texcoord;
uniform sampler2D u_texture;
uniform float u_angle;
void main()
{
vec2 coord = v_texcoord;
float sin_factor = sin(u_angle);
float cos_factor = cos(u_angle);
coord = (coord - 0.5) * mat2(cos_factor, sin_factor, -sin_factor, cos_factor);
coord += 0.5;
gl_FragColor = texture2D(u_texture, coord);
}
Run Code Online (Sandbox Code Playgroud) 在Android Q中,MediaStore.Files.FileColumns.DATA字段已弃用,可能为null或应用可能无权读取它,因此可以使用以下方法重命名文件的文件名部分(而不是路径)仅其媒体内容Uri?
到现在为止,DATA字段可用于从已知Uri查找文件的真实路径,但是由于已弃用该文件,因此其想法是什至不尝试查找或解析真实文件路径,而仅使用其内容Uri 。
考虑到Uri将采用标准媒体内容格式(不是SAF格式):content:// media / external / images / media / 123
目的是重命名Uri指向的文件的名称。
我知道我可以更新MediaStore的TITLE和DISPLAY_NAME字段,但这不会更改文件名,并且如果用户决定将文件移至设备之外,则该文件仍将具有旧文件名。
我正在尝试将 rgba 缓冲区转换为 argb,是否有任何方法可以改进下一个算法,或者任何其他更快的方法来执行此类操作?考虑到 alpha 值在 argb 缓冲区中一次并不重要,并且应始终以 0xFF 结束。
int y, x, pixel;
for (y = 0; y < height; y++)
{
for (x = 0; x < width; x++)
{
pixel = rgbaBuffer[y * width + x];
argbBuffer[(height - y - 1) * width + x] = (pixel & 0xff00ff00) | ((pixel << 16) & 0x00ff0000) | ((pixel >> 16) & 0xff);
}
}
Run Code Online (Sandbox Code Playgroud) 通过Android中的MediaCodec进行编码时,我正在登录logcat下一个错误.
实际编码工作正常,输出正确生成,所以我真的不明白为什么我得到这个跟踪.这是一个无害的错误痕迹,还是我缺少的东西?
E/ACodec(6438):[OMX.qcom.video.encoder.h263] storeMetaDataInBuffers(输出)失败w/err -1010
接下来是我得到跟踪的代码
final int BIT_RATE = 4000000;
final int FRAME_RATE = 30;
final int IFRAME_INTERVAL = 5;
final String MIME_TYPE = "video/avc";
final MediaFormat format = MediaFormat.createVideoFormat(MIME_TYPE, width, height);
format.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
format.setInteger(MediaFormat.KEY_BIT_RATE, BIT_RATE);
format.setInteger(MediaFormat.KEY_FRAME_RATE, FRAME_RATE);
format.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, IFRAME_INTERVAL);
MediaCodec encoder = MediaCodec.createEncoderByType(MIME_TYPE);
//---------------------------------
// NEXT LINE PRODUCES THE TRACE
encoder.configure(format, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
//---------------------------------
Run Code Online (Sandbox Code Playgroud) 在 Android Q 中,不是默认文件管理器或图库的应用程序只能修改和/或删除它们拥有的图像文件,因此,应用程序创建的图像文件。
授予读/写权限不允许修改或删除不属于应用程序的任何文件。
这意味着不仅其他应用程序创建的文件无法访问,而且如果某个应用程序被卸载然后重新安装,那么该应用程序将失去该应用程序先前创建的所有公共文件的所有权。因此,重新安装后,它不能再修改或删除它们。
当想要修改一个图像文件或删除大量的多个图像文件,这些文件以前属于某个应用程序,但由于重新安装而失去了所有权,那么实现此类操作(删除或修改)的过程是什么?
最好的解决方案是不使用 SAF 文件选择器,以避免请求用户通过 SAF 选择和授予位置。
而如果唯一的解决方案是使用SAF文件选择器,那么如何触发直接提示删除一组已知的特定文件,而无需请求树访问权限,而不必告诉用户浏览、搜索和自己做呢?
在 Android API 14 中,引入了使用相机聚焦到特定区域的可能性。API明确规定可以提供权重,但是读了几遍描述后,我仍然不知道如何使用它以及设置哪个值,或者在哪些因素下决定要使用的权重值,任何人都可以请更好地解释一下如何在对焦时使用此参数?谢谢
每个区域由一个指定其边界的矩形和一个确定其重要性的权重组成。边界是相对于相机的当前视野而言的。映射坐标使得 (-1000, -1000) 始终为当前视野的左上角,(1000, 1000) 始终为当前视野的右下角。不允许设置边界超出该范围的区域。不允许出现宽度或高度为零或负数的区域。 权重的范围必须为 1 到 1000,代表该区域中每个像素的权重。这意味着在相同重量的情况下,较大的计量区域与较小的区域相比,对计量结果的影响更大。测光区域可以重叠,驾驶员将在重叠区域添加权重。
尝试使用ImageDecoder获取图像大小时,我找不到任何仅获取大小而不解码图像位图的选项。
使用BitmapFactory可以完成:
BitmapFactory.Options.inJustDecodeBounds = true
Run Code Online (Sandbox Code Playgroud)
此设置使解码器仅获取图像大小而无需解码并返回位图。但是ImageDecoder没有等效的选项。
另外,大小好像只有在 ImageDecoder. OnHeaderDecodedListener被调用,此时没有任何选项可以取消解码并避免返回位图。
在Android Q中,不建议使用MediaStore.Files.FileColumns.DATA 字段,该字段可以为Null或应用程序在以此类OS版本为目标时无权读取它,因此最好仅使用文件内容Uri进行工作。
由于MediaScannerConnection仅接受文件路径,因此我发现对于Android Q,这不再是一个选择。
在不知道其真实路径且仅使用其Uri的情况下,如何强制MediaStore 自动更新/重新扫描单个文件的方法是什么?这样做的目的不是什至试图找到真正的道路,而只能依靠乌里。
考虑强制更新的Uri是媒体内容Uri (而不是SAF Uri)。
示例:content:// media / external / images / media / 123
解决方案一定不能是重新扫描整个存储或再次卸载/装入存储,因为这将在我们的工作流程中造成很高的性能损失,并将使其完全无法使用。
并且由于打算仅使用Uri,因此避免强行扫描文件的任何特定目录,如果其中包含大量文件,这也会产生影响,并暗示必须从Uri解析真实目录路径,这不是一个选择。
更新:
我们尝试了 Android O中引入的ContentResolver.refresh方法,但结果没有成功,但是当涉及诸如以下内容的媒体内容Uri时,此方法根本不做任何刷新:content:// media / external / images / media / 123
final ContentResolver resolver = context.getContentResolver();
resolver.refresh(uri, null, null);
Run Code Online (Sandbox Code Playgroud) android ×7
mediastore ×2
uri ×2
argb ×1
crop ×1
delete-file ×1
encoding ×1
file ×1
focus ×1
glsles ×1
imagedecoder ×1
mediacodec ×1
opencv ×1
opengl-es ×1
performance ×1
rename ×1
rgba ×1
rotation ×1
saf ×1
shader ×1
size ×1
textures ×1