【问题标题】:How to quickly transform from RGB24 to BGRA on iOS?如何在 iOS 上快速从 RGB24 转换为 BGRA?
【发布时间】:2012-07-26 19:14:38
【问题描述】:

我使用的是vImageConvert_RGB888toARGB8888vImagePermuteChannels_ARGB8888。先把RGB24改成ARGB,因为OPENGL ES不支持ARGB,所以需要用vImagePermuteChannels_ARGB8888把ARGB改成BGRA。但是当需要更改的数据很大时,时间成本很高,那么有人有更好的方法吗?谢谢!我的代码是这样的:

- (void)transformRGBToBGRA:(const UInt8 *)pict{
rgb.data = (void *)pict;

vImage_Error error = vImageConvert_RGB888toARGB8888(&rgb,NULL,0,&argb,NO,kvImageNoFlags);
if (error != kvImageNoError) {
    NSLog(@"vImageConvert_RGB888toARGB8888 error");
}

const uint8_t permuteMap[4] = {3,2,1,0};

error = vImagePermuteChannels_ARGB8888(&argb,&bgra,permuteMap,kvImageNoFlags);
if (error != kvImageNoError) {
    NSLog(@"vImagePermuteChannels_ARGB8888 error");
}

free((void *)pict);

}

【问题讨论】:

  • 你已经发布了这个并且得到了一个带有 4 个标记的答案 = 你为什么要再次发布它?见stackoverflow.com/q/11683864/96716
  • 因为我觉得它们不一样,一个是 BGR ,另一个是 BGRA ,它们需要不同的内存容量。所以我想知道APPLE是否有更简单的api来完成这项工作。

标签: ios time transform rgb rgba


【解决方案1】:

现在我发现最快的解决方案是组装。就像这样:

__asm__ volatile(
                 "0:                \n"
                 "# load 3 64-bit regs with interleave: \n"
                 "vld3.8      {d0,d1,d2}, [%0]!   \n"
                 "# swap d0 and d2 - R and B\n"
                 "vswp d0, d2   \n"
                 "# store 4 64-bit regs: \n"
                 "vst4.8      {d0,d1,d2,d3}, [%2]!      \n"
                 "subs        %1, %1, #1       \n"
                 "bne         0b            \n"
                 :
                 : "r"(img), "r"(numPixels24), "+r"(bgraData)
                 : "r6", "r7","r8"
                 );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-02
    • 2011-11-03
    • 1970-01-01
    • 1970-01-01
    • 2011-08-28
    • 1970-01-01
    • 2011-10-23
    相关资源
    最近更新 更多