在Java中填充预先分配的ByteBuffer的最快方法是什么?
我首先使用"assignedirect"设置ByteBuffer的大小,这只需要完成一次.在我需要尽可能快地填充它(循环它)后,新数据以每5ms的形式到达一个byte []数组,并且没有占用内存,因为我已经预先分配了ByteBuffer.目前我使用".put()"指令,在我的系统中需要大约100ms才能完成.还有另一种填充ByteBuffer的方法吗?".wrap()"函数运行得更快而不重新分配数组吗?
在 Android API 14 中,引入了使用相机聚焦到特定区域的可能性。API明确规定可以提供权重,但是读了几遍描述后,我仍然不知道如何使用它以及设置哪个值,或者在哪些因素下决定要使用的权重值,任何人都可以请更好地解释一下如何在对焦时使用此参数?谢谢
每个区域由一个指定其边界的矩形和一个确定其重要性的权重组成。边界是相对于相机的当前视野而言的。映射坐标使得 (-1000, -1000) 始终为当前视野的左上角,(1000, 1000) 始终为当前视野的右下角。不允许设置边界超出该范围的区域。不允许出现宽度或高度为零或负数的区域。 权重的范围必须为 1 到 1000,代表该区域中每个像素的权重。这意味着在相同重量的情况下,较大的计量区域与较小的区域相比,对计量结果的影响更大。测光区域可以重叠,驾驶员将在重叠区域添加权重。
我正在尝试将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) 目前我正在使用带有硬编码间隔的 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)
但这会在圆圈的起点和终点处产生一个非等距的破折号,如下图所示:
我当然可以手动调整它,但这仅适用于一种特定的设备密度,并在不同的显示密度下再次产生相同的问题。计算等距破折号的公式是什么?
我试图翻转缓冲区,但缓冲区没有完全处理.是一个像素的缓冲区,我基本上需要垂直翻转它.谁能发现我做错了什么?提前致谢.
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) 我已经编写了下一个函数来旋转一个无符号字符像素数组,该数组将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) 如何在一定范围内振荡,但时间间隔恒定?我想出了下一个算法,但有一个问题,即增加范围会使结果值也太快。
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)