2014-12-12 6 views
0

SDK에서 BGR 픽셀 형식 (예 : BGRBGRBGR)이있는 이미지를 얻습니다. 다른 응용 프로그램의 경우이 형식을 RGB 평면 RRRGGGBBB으로 변환해야합니다.BGR을 RGB 평면 픽셀 형식으로 신속하게 변환

저는 C# .NET 4.5 32 비트를 사용하고 있으며 데이터는 같은 크기의 바이트 배열입니다.

지금 배열 소스를 반복하고 BGR 값을 대상 배열의 적절한 위치에 할당하고 있지만 너무 길어 (1,300 만 화소 이미지의 경우 180ms). 코드가 실행되는 프로세서는 MMX, SSE, SSE2, SSE3, SSSE3에 액세스 할 수 있습니다.

전환 속도를 높이는 방법이 있습니까?

편집 :

// the array with the BGRBGRBGR pixel data 
byte[] source; 
// the array with the RRRGGGBBB pixel data 
byte[] result; 
// the amount of pixels in one channel, width*height 
int imageSize; 

for (int i = 0; i < source.Length; i += 3) 
{ 
    result[i/3] = source[i + 2]; // R 
    result[i/3 + imageSize] = source[i + 1]; // G 
    result[i/3 + imageSize * 2] = source[i]; // B 
} 

편집 : 여기 내가 사용하고 변환이 내가 세 루프, 각 채널 하나에 소스 배열에 대한 액세스를 분할했지만, 정말 도움이되지 않았다. 그래서 나는 제안에 개방적이다.

for (int i = 0; i < source.Length; i += 3) 
{ 
    result[i/3] = source[i + 2]; // R 
} 

for (int i = 0; i < source.Length; i += 3) 
{ 
    result[i/3 + imageSize] = source[i + 1]; // G 
} 

for (int i = 0; i < source.Length; i += 3) 
{ 
    result[i/3 + imageSize * 2] = source[i]; // B 
} 

질문에 답할 수 없기 때문에 범프. 모든 조언은 매우 감사드립니다!

+2

원래 변환을 사용할 수 없을 때 더 빠른 변환이 가능하면 누구나 볼 수 없습니다. – Sayse

+0

현재 접근 방식에 대한 코드를 보여주십시오. – HimBromBeere

+1

다시 투표하십시오. 진지하게, 그는 도서관을 요구하지 않고있다. 코드가 주어 졌을지라도 나는 그것을 재 작성함으로써 속도를 높이는 두 가지 방법을 볼 수 있습니다. .NET 프레임 워크/타사 라이브러리가없는 Visual Studio 표준 에코 시스템에는 이에 대한 유효한 대답이 있습니다. – TomTom

답변

0

SSE3의 PSHUFB - Packed Shuffle Bytes 명령어를 사용해보십시오. 정렬 된 메모리 읽기/쓰기를 사용하고 있는지 확인하십시오. 각 XMMWORD 크기의 블록에서 마지막으로 매달려있는 B 값을 처리하기 위해 무언가를 까다롭게해야 할 것입니다. 제대로하기는 어려울 지 모르지만 엄청난 속도 향상이 있어야합니다. 도서관 코드를 찾을 수도 있습니다. C 또는 C++ DLL을 만들고 P/Invoke를 사용해야 할 것 같아요.하지만 아마도 C#에서 SSE 명령어를 사용하는 방법이 있습니다.

편집 - this question은 ARGB에서 BGR까지 약간 다른 문제이지만 사용 된 기술은 사용자가 필요로하는 것과 비슷합니다.

+0

도움을 주셔서 감사합니다.하지만 불행히도 intrinsics에 대한 지식이 부족하여 코드가 많은 도움이되지 않으며이 작은 작업을 위해 라이브러리를 사용하는 것이 문제가되지 않습니다. – RBS

0

Basler 회사에는 Windows 및 Linux에서 작동하는 Basler Pylon이라는 카메라 용 SDK가 있습니다.
이 SDK에는 C++, C# 등의 API가 있습니다.
이미지 변환 클래스가 PixelDataConverter인데 필요한 것 같습니다.