Fast method to copy memory with translation - ARGB to BGR

前端 未结 11 1922
野趣味
野趣味 2020-12-07 10:47

Overview

I have an image buffer that I need to convert to another format. The origin image buffer is four channels, 8 bits per channel, Alpha, Red, Green, and Blue

11条回答
  •  北荒
    北荒 (楼主)
    2020-12-07 11:28

    I am coming a little late to the party, seeming that the community has already decided for poseur's pshufb-answer but distributing 2000 reputation, that is so extremely generous i have to give it a try.

    Here's my version without platform specific intrinsics or machine-specific asm, i have included some cross-platform timing code showing a 4x speedup if you do both the bit-twiddling like me AND activate compiler-optimization (register-optimization, loop-unrolling):

    #include "stdlib.h"
    #include "stdio.h"
    #include "time.h"
    
    #define UInt8 unsigned char
    
    #define IMAGESIZE (1920*1080) 
    int main() {
        time_t  t0, t1;
        int frames;
        int frame; 
        typedef struct{ UInt8 Alpha; UInt8 Red; UInt8 Green; UInt8 Blue; } ARGB;
        typedef struct{ UInt8 Blue; UInt8 Green; UInt8 Red; } BGR;
    
        ARGB* orig = malloc(IMAGESIZE*sizeof(ARGB));
        if(!orig) {printf("nomem1");}
        BGR* dest = malloc(IMAGESIZE*sizeof(BGR));
        if(!dest) {printf("nomem2");}
    
        printf("to start original hit a key\n");
        getch();
        t0 = time(0);
        frames = 1200;
        for(frame = 0; frame

    The results are these (on my core 2 subnotebook):

    F:\>gcc b.c -o b.exe
    
    F:\>b
    to start original hit a key
    finished original of 1200 frames in 16 seconds
    to start alternative hit a key
    finished alternative of 1200 frames in 10 seconds
    
    F:\>gcc b.c -O3 -o b.exe
    
    F:\>b
    to start original hit a key
    finished original of 1200 frames in 8 seconds
    to start alternative hit a key
    finished alternative of 1200 frames in 4 seconds
    

提交回复
热议问题