- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在阅读 this tutorial关于从 iPhone 相机获取像素数据。
虽然运行和使用此代码没有问题,但我需要获取相机数据的输出(来自 BGRA)并将其转换为 ARGB,以便我可以将其与外部库一起使用。我该怎么做?
最佳答案
如果您使用的是 iOS 5.0,则可以使用 Accelerate 框架内的 vImage 使用如下代码(取自 Apple 的 WebCore source code)进行 NEON 优化的颜色组件交换:
vImage_Buffer src;
src.height = height;
src.width = width;
src.rowBytes = srcBytesPerRow;
src.data = srcRows;
vImage_Buffer dest;
dest.height = height;
dest.width = width;
dest.rowBytes = destBytesPerRow;
dest.data = destRows;
// Swap pixel channels from BGRA to RGBA.
const uint8_t map[4] = { 2, 1, 0, 3 };
vImagePermuteChannels_ARGB8888(&src, &dest, map, kvImageNoFlags);
其中 width
、height
和 srcBytesPerRow
是通过 CVPixelBufferGetWidth()
从像素缓冲区获取的,CVPixelBufferGetHeight()
和 CVPixelBufferGetBytesPerRow()
。 srcRows
是指向像素缓冲区中字节基地址的指针,destRows
是您分配用于保存输出 RGBA 图像的内存。
这应该比简单地遍历字节和交换颜色分量要快得多。
根据图像大小,更快的解决方案是将帧上传到 OpenGL ES,渲染一个简单的矩形并将其作为纹理,然后使用 glReadPixels() 下拉 RGBA 值。更好的办法是使用 iOS 5.0 的纹理缓存进行上传和下载,对于 iPhone 4 上的 720p 帧,这个过程只需要 1-3 毫秒。当然,使用 OpenGL ES 意味着需要提取更多支持代码这个关闭。
关于ios - 将 BGRA 转换为 ARGB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10654909/
Closed. This question needs details or clarity。它当前不接受答案。
所以,我在用 C++ 和 DirectX 11 开发游戏引擎,我注意到人们通常使用 BGRA 而不是 RGBA 作为 SwapChain 格式。人们为什么那样做?为什么是 32 位颜色而不是 256
所以,我在用 C++ 和 DirectX 11 开发游戏引擎,我注意到人们通常使用 BGRA 而不是 RGBA 作为 SwapChain 格式。人们为什么那样做?为什么是 32 位颜色而不是 256
我有一个缓冲区,其中包含一个“原始”BGRA 纹理,每种颜色一个字节。线条顺序相反(纹理颠倒)。 BGRA 缓冲区全是绿色 (0, 255, 0, 255)。 我需要将其转换为 RGBA 并翻转纹理线
我正在阅读 this tutorial关于从 iPhone 相机获取像素数据。 虽然运行和使用此代码没有问题,但我需要获取相机数据的输出(来自 BGRA)并将其转换为 ARGB,以便我可以将其与外部库
下午好! 在DirectX中我是初学者,很多东西我都不知道。 我在视频卡的内存中有一个 RGBA 格式的纹理 (DXGI_FORMAT_R8G8B8A8_UNORM)。这是截获的游戏缓冲区。在将其内容
我有一个 BGRA 数组,需要将其绘制到 Canvas 上。 目前我正在这样做: var aVal = returnedFromChromeWorker; var can = doc.createEl
我的目的是录屏。我正在使用 Windows DXGI API 接收屏幕截图,并使用 libx264 将屏幕截图编码为视频。将 BGRA 图像直接馈送到 libx264 会在输出视频中产生奇怪的颜色。因
有人可以解释以下三个函数之间的区别吗? typedef union { std::uint8_t B, G, R, A; std::uint32_t Colour; } BGRA; 第
我想使用 GPUImage 框架捕获原始像素数据进行操作。我这样捕获数据: CVImageBufferRef cameraFrame = CMSampleBufferGetImageBuffer(i
我将 BGRA 图像转储为以下格式(连续)的二进制文件:[(b, g, r, a), (b, g, r, a), (b, g, r, a ) ...]我知道图像的宽度、高度和 channel 数量(在
我想用iphone的相机拍一张原始图像数据,然后在笔记本电脑上用matlab或opencv进行后处理。所以我需要把这个原始图像数据从 iphone 带到笔记本电脑上。 目前,我使用 AVFoudnat
所以,我对刚刚运行的快速测试感到非常困惑。我正在用 C# 做一些图像处理。 Get/SetPixel() 已被证明太慢,所以我使用 LockBits 来获取原始数据。 但是,我似乎遇到了一个我无法弄清
在跟进之前关于将 RGB 转换为 RGBA 以及 ARGB 转换为 BGR 的一些问题后,我想使用 SSE 加快 RGB 到 BGRA 的转换.假设一台 32 位机器,并且想使用 intrinsics
在跟进之前关于将 RGB 转换为 RGBA 以及 ARGB 转换为 BGR 的一些问题后,我想使用 SSE 加快 RGB 到 BGRA 的转换.假设一台 32 位机器,并且想使用 intrinsics
我目前有一个问题,即库创建了 BGRA 像素格式的 DX11 纹理。 但是显示库只能正确显示RGBA。 (这意味着颜色在渲染图像中交换) 环顾四周后,我发现了一个简单的 for 循环来解决问题,但性能
我正在使用原始相机帧在 opengl 中进行一些视频处理。我告诉相机给我 BGRA,因为我听说这在 iPhone 上性能更高。现在,我知道原生相机格式是 YUV,但为了处理我正在做红绿蓝。 整个 BG
我正在使用 Metal 开发一个 iOS 应用程序,并且可以选择使用 RGBA 或 BGRA 作为纹理格式。该应用程序将是: 渲染成纹理 在屏幕上绘制纹理 从纹理生成UIImages 从UIImage
我有一个包含 BGRA 栅格数据的 byte[] 数组(例如,第一个字节 = 蓝色分量,第二个 = 绿色,第五个 = 下一个像素,蓝色),并且想使用它。 具体来说,是否有一个 Java 类已经被设计来
我正在开展一个项目,我使用 AVCaptureSession 捕获用户的视频输入。问题是我需要 BGRA 格式的输出以使用 OpenCV 渲染它,但随后我需要将其更改回默认的 420f 格式以将其显示
我是一名优秀的程序员,十分优秀!