-3

私が使用しているのはvImageConvert_RGB888toARGB8888vImagePermuteChannels_ARGB8888です。OPENGL ESはARGBをサポートしていないため、最初にRGB24からARGBに変更します。したがって、。を使用してARGBをBGRAに変更する必要がありvImagePermuteChannels_ARGB8888ます。しかし、データを変更する必要がある場合、時間コストが高くなるので、より良い方法を持っている人はいますか?ありがとう!このような私のコード:

- (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

1 に答える 1

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"
                 );
于 2012-07-30T10:16:40.073 に答える