상세 컨텐츠

본문 제목

JPEG-TURBO #3 - 스마트 스케일러 사용 및 성능 측정

병렬처리/SIMD

by cepiloth 2018. 12. 28. 12:15

본문

728x90
반응형


개요


빌드 후 헤더파일과 바이너리 파일을 프로젝트 속성을 추가 해야 한다.


  • 헤더 파일
    • jconfig.h, jerror.h, jmorecfg.h, jpeglib.h, turbojpeg.h 
  • 바이너리 파일 
    • jpeg62.dll, turbojpeg.dll, jpeg.lib, jpeg-static.lib, turbojpeg.lib, turbojpeg-static.lib


헤더파일은 임의의 include 폴더를 만들고 모두 복사 해준다. 이후 프로젝트 속성에서 추가 포함 디렉토리에 include 경로를 추가 한다.



바이너리 파일 또한 링커 - 추가 종속성에 필요한 파일들을 추가 한다. 아래는 예시 이다.



스마트 스케일러 적용


JPEG 내부의 스마트 스케일러를 사용하기 위해서는 아래 코드가 필요 하다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int nWidth = 500// 화면에 표시 될 이미지의 WIDTH
int nHeight = 500// 화면에 표시 될 이미지의 HEIGHT
 
int width = 0;
int height = 0;
 
int nResult = tjDecompressHeader2(hDecoder, (unsigned char*)buffer, sizebytes, &width, &height, &nSubSampling);
 
tjscalingfactor *scalingFactors = NULL;
int numScalingFactors = 0;
 
if ((scalingFactors = tjGetScalingFactors(&numScalingFactors))) {
    tjscalingfactor scalingFactor = { 1};
 
    for (int i = 0; i < numScalingFactors; i++) {
        int scaledw = TJSCALED(width, scalingFactors[i]);
        int scaledh = TJSCALED(height, scalingFactors[i]);
        if (scaledw <= nWidth && scaledh <= nHeight) {
            width = scaledw;
            height = scaledh;
         break;
        }
    }
}
cs


tjDecompressHeader2() 메소드를 호출 하면 이미지의 원본 사이즈를 알 수 있다.


1
2
3
4
5
int width = 0;
int height = 0;
 
int nResult = tjDecompressHeader2(hDecoder, (unsigned char*)buffer, sizebytes, &width, &height, &nSubSampling);
    
cs


원본 크기를 찾은 이후에는 화면에 표시 될 크기와 가장 가까운 크기를 찾는다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
tjscalingfactor *scalingFactors = NULL;
int numScalingFactors = 0;
 
if ((scalingFactors = tjGetScalingFactors(&numScalingFactors))) {
    tjscalingfactor scalingFactor = { 1};
 
    for (int i = 0; i < numScalingFactors; i++) {
        int scaledw = TJSCALED(width, scalingFactors[i]);
        int scaledh = TJSCALED(height, scalingFactors[i]);
        if (scaledw <= nWidth && scaledh <= nHeight) { // 화면의 표시 될 크기와 가장 가까운 크기를 찾는다.
            width = scaledw;
            height = scaledh;
            break;
        }
    }
}
cs


이후 tjDecompress2() 메소드를 호출 하면 스마트 스케일이 적용된 픽셀을 얻을 수 있다.


1
tjDecompress2(hDecoder, (unsigned char*)buffer, sizebytes, pPixelData, width, TJPAD(width * 4), height, TJPF_BGRX, TJFLAG_FASTDCT | TJFLAG_NOREALLOC);
cs




결과 



WIC(Window Image Component), JPEG9A, JPEG-TURBO 라이브러리로 각각의 이미지를 로딩하여 성능 측정을 하였다. 대부분에 이미지 에서 JPEG-TURBO 라이브리에서 빠른 성능을 보였다. 해당 측정의 결과는 JPEG 내부의 SmartScaler 를 사용하여 측정 하였다. JPEG-TURBO 는 JPEG-9A 보다 59% 이상에 빠른 성능을 보인다.


Windows 10 Pro, Intel(r) Core(TM) i7-4790 CPU @ 3.60GHz, Ram 8 GB, x64 에서 테스트 하였다.


728x90
반응형

'병렬처리 > SIMD' 카테고리의 다른 글

JPEG-TURBO #2 - CPU 상태 조회  (0) 2018.12.24
JPEG-TURBO #1 - 설치  (0) 2018.12.24
NEON 과 SSE 간에 변환  (0) 2018.12.17

관련글 더보기

댓글 영역