小编Per*_*abs的帖子

Java ByteBuffer Put vs wrap

在Java中填充预先分配的ByteBuffer的最快方法是什么?

我首先使用"assignedirect"设置ByteBuffer的大小,这只需要完成一次.在我需要尽可能快地填充它(循环它)后,新数据以每5ms的形式到达一个byte []数组,并且没有占用内存,因为我已经预先分配了ByteBuffer.目前我使用".put()"指令,在我的系统中需要大约100ms才能完成.还有另一种填充ByteBuffer的方法吗?".wrap()"函数运行得更快而不重新分配数组吗?

java arrays performance bytebuffer

5
推荐指数
1
解决办法
1万
查看次数

在Android中,权重区域参数的聚焦到底有什么用?

在 Android API 14 中,引入了使用相机聚焦到特定区域的可能性。API明确规定可以提供权重,但是读了几遍描述后,我仍然不知道如何使用它以及设置哪个值,或者在哪些因素下决定要使用的权重值,任何人都可以请更好地解释一下如何在对焦时使用此参数?谢谢

引用自SDK帮助

每个区域由一个指定其边界的矩形和一个确定其重要性的权重组成。边界是相对于相机的当前视野而言的。映射坐标使得 (-1000, -1000) 始终为当前视野的左上角,(1000, 1000) 始终为当前视野的右下角。不允许设置边界超出该范围的区域。不允许出现宽度或高度为零或负数的区域。 权重的范围必须为 1 到 1000,代表该区域中每个像素的权重。这意味着在相同重量的情况下,较大的计量区域与较小的区域相比,对计量结果的影响更大。测光区域可以重叠,驾驶员将在重叠区域添加权重。

android focus android-camera

5
推荐指数
1
解决办法
2079
查看次数

在Android camera2下将YUV_420_888转换为位图的图像不正确

我正在尝试将YUV_420_888图像转换为来自camera2预览的位图。但是输出图像的颜色不正确。

接下来是我正在运行的用于生成位图的测试代码。仅是测试代码,因此请不要对不相关的因素进行任何代码审查,例如,位图将被回收,或者将连续创建RenderScript。该代码仅用于测试从YUV到RGB的转换,仅此而已。

其他因素是,该代码应从API 22及更高版本运行,因此使用RenderScript特定的ScriptIntrinsicYuvToRGB应该足够,而不必使用旧的手动转换,由于缺乏适当的YUV_420_888支持,因此仅在以前的Android版本中才需要使用。

由于RenderScript已经提供了专用于处理所有类型的YUV转换的ScriptIntrinsicYuvToRGB,我认为问题可能出在如何从Image对象获取YUV字节数据,但我无法弄清楚问题出在哪里。

要在Android Studio中查看输出位图,请在bitmap.recycle()中放置一个断点,因此在回收之前,可以使用“查看位图”选项在“变量调试”窗口中对其进行查看。

请让我知道是否有人可以发现转换的问题:

@Override
public void onImageAvailable(ImageReader reader)
{
    RenderScript rs = RenderScript.create(this.mContext);

    final Image image = reader.acquireLatestImage();

    final Image.Plane[] planes = image.getPlanes();
    final ByteBuffer planeY = planes[0].getBuffer();
    final ByteBuffer planeU = planes[1].getBuffer();
    final ByteBuffer planeV = planes[2].getBuffer();

    // Get the YUV planes data

    final int Yb = planeY.rewind().remaining();
    final int Ub = planeU.rewind().remaining();
    final int Vb = planeV.rewind().remaining();

    final ByteBuffer yuvData = ByteBuffer.allocateDirect(Yb + Ub + Vb);

    planeY.get(yuvData.array(), 0, Yb);
    planeU.get(yuvData.array(), Yb, …
Run Code Online (Sandbox Code Playgroud)

android bitmap yuv android-camera2

3
推荐指数
1
解决办法
1692
查看次数

如何使用 DashPathEffect 绘制等距破折号

目前我正在使用带有硬编码间隔的 DashPathEffect 来绘制一个圆圈,如下所示:

float[] intervals = new float[]{ 3, 18 };
DashPathEffect path = new DashPathEffect(intervals, 0); 
paint.setPathEffect(path);
… … … …
canvas.drawCircle(x, y, radius, paint);
Run Code Online (Sandbox Code Playgroud)

但这会在圆圈的起点和终点处产生一个非等距的破折号,如下图所示:

在此处输入图片说明

我当然可以手动调整它,但这仅适用于一种特定的设备密度,并在不同的显示密度下再次产生相同的问题。计算等距破折号的公式是什么?

geometry android

3
推荐指数
1
解决办法
1371
查看次数

C\C++中的简单翻转缓冲区(垂直)问题

我试图翻转缓冲区,但缓冲区没有完全处理.是一个像素的缓冲区,我基本上需要垂直翻转它.谁能发现我做错了什么?提前致谢.

void flipVertically(unsigned int* buffer, const unsigned int width, const unsigned int height)
{
    const unsigned int rowWidth = width; // Length of a row
    const unsigned int rows = height / 2; // Iterate only half the buffer to get a full flip
    unsigned int* tempRow = (unsigned int*)malloc(rowWidth);

    for (int rowIndex = 0; rowIndex < rows; rowIndex++)
    {
        memcpy(tempRow, buffer + (rowIndex * rowWidth), rowWidth);
        memcpy(buffer + (rowIndex * rowWidth), buffer + (height - rowIndex - 1) * …
Run Code Online (Sandbox Code Playgroud)

c c++ pixels memcpy flip

2
推荐指数
1
解决办法
1348
查看次数

在C ++中将像素阵列旋转90度

我已经编写了下一个函数来旋转一个无符号字符像素数组,该数组将RGB图像保持90度。我面临的问题是旋转的输出全部乱码。

void rotate90(unsigned char *buffer, const unsigned int width, const unsigned int height)
{
    const unsigned int sizeBuffer = width * height * 3; 
    unsigned char *tempBuffer = new unsigned char[sizeBuffer];

    for (int y = 0, destinationColumn = height - 1; y < height; ++y, --destinationColumn)
    {
        int offset = y * width;

        for (int x = 0; x < width; x++)
        {
            tempBuffer[(x * height) + destinationColumn] = buffer[offset + x];
        }
    }

    // Copy rotated pixels

    memcpy(buffer, tempBuffer, …
Run Code Online (Sandbox Code Playgroud)

c++ rotation pixels

2
推荐指数
1
解决办法
2769
查看次数

在范围内振荡值

如何在一定范围内振荡,但时间间隔恒定?我想出了下一个算法,但有一个问题,即增加范围会使结果值也太快。

const int RANGE = 5; // Oscillate between -5 and 5
long start = 0;

float getStepTime()
{
    struct timespec ts;
    clock_gettime(CLOCK_MONOTONIC_RAW, &ts);
    long now = ts.tv_sec * 1000 + ts.tv_nsec / 1000000ULL;

    if (start == 0) { start = now; }

    float ellapsed = (now - start) / 1000.0f;
    float result = sin(ellapsed) * RANGE;

    printf("%f", result);
    return result;
}
Run Code Online (Sandbox Code Playgroud)

c++ time

2
推荐指数
1
解决办法
1615
查看次数