마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

고해상도 이미지 출력 및 확대 축소 성능

0 추천
이미지를 ViewPager 각 페이지에 출력하여 페이지를 넘기고, 또는 핀치줌으로 확대 축소 할 수 있는 갤러리 기능을 구현하고 있습니다. 여러 오픈 소스들을 써봤는데, 테스트 폰(갤노트2)이 연식이 좀 되서 그런지 퍼포먼스가 많이 떨어지더라구요. 고해상도 이미지를 핀치줌, 패닝, 페이지 전환 했을 때 버벅거림이 심합니다. 하지만 네이티브 갤러리 앱에서는 전혀 버벅거림이 없는걸 봐서는 단순히 테스트 폰의 연식 문제를 탓할 수만은 없다고 생각합니다.

네이티브 앱 갤러리 처럼 원활하게 동작하는 것을 고민하다가 결국 업계 표준이고 가장 빠르다는 인/디코더 libjpeg-turbo를 ndk로 쓰는 것을 연구해보기로 했는데요. 물론 ViewPager에서의 핀치줌, 패닝 등에 대한 퍼포먼스는 디코딩 속도보다 Subsampling 알고리즘이 더 크게 영향을 미칠것 같다는 것을 어렴풋이 짐작하지만 말이죠. 참고로 ndk 경험이 없다보니 아직 제대로 성공하지는 못했습니다.

서론이 길었는데요. 제 질문은 아래 두가지 입니다.

1. 핀치줌에 대한 Subsampling 알고리즘이 적용된 핀치줌 오픈소스 괜찮은게 뭐 없을까요? ARGB_8888로 출력되기를 원하구요. 제가 Subsampling-scale-image-view라는 오픈 소스를 추천받아 사용해봤는데, RGB_565에 최적화가 된 듯 싶습니다. ARGB_8888로 모디해서 사용할 경우 원하는 만큼의 성능이 안나옵니다.

2. libjpeg-turbo에 대한 질문인데요. 이것을 ndk로 빌드해서 사용하면 과연 성능이 향상될까요? BitmapFactory.decodeFile 같은 안드로이드 자체 API도 결국 (소스를 까본적은 없지만) 네이티브 디코더를 wrapping 한게 아닐까하는 생각 때문에 결국 성능차이는 별로 없지 않을까 하는 의문이 듭니다. 실 예로 libjpeg-turbo는 아니지만 OpenCV를 사용했을 때 3200x2400 정도의 jpg를 화면에 출력하는데까지 800ms, BitmapFactory.decodeFile를 사용했을 때 400ms 수준으로 자체 API가 더 빠른 것을 확인 했거든요.

고수님들의 조언을 부탁드립니다.
THK (2,360 포인트) 님이 2017년 1월 19일 질문

2개의 답변

0 추천
 
채택된 답변
1. 안드로이드 플랫폼이 내부적으로 libjpeg-turbo를 사용합니다. (노트 2는 다를 수도 있습니다.)

https://android.googlesource.com/platform/external/libjpeg-turbo/

2. 안드로이드 기본 갤러리 앱 코드를 분석해보세요. (노트 2에 있는 것과는 다를 겁니다.)

https://android.googlesource.com/platform/packages/apps/Gallery/

https://android.googlesource.com/platform/packages/apps/Gallery2/

https://android.googlesource.com/platform/packages/apps/Gallery3D/
익명사용자 님이 2017년 1월 19일 답변
THK님이 2017년 1월 20일 채택됨
정보 감사합니다. 링크에서 얻은 소스가 빌드까지는 안되는게 아쉽지만 그래도 코드를 까볼 수 있어서 확실히 도움은 될 것 같네요.
0 추천

안드로이드에서 영상 출력은  RGB 형태의  Bitmap 출력  혹은 YUV형태의  openGL(vulkan) 로 출력으로 나뉩니다.

색손상이 없어야 하니 YUV 변환을 하지 않는 Bitmap 출력으로 하셔야 할 듯 하며, 

libjpeg-turbo를 쓰더라도 결론적으로 Bitmap 객체를 만들어서 출력해야 하니. 안드로이드에서 제공하는 BitmapFactory.decodeFile 를 써서 하시는게 제일 좋을 듯 합니다. 

문제가 되는 부분은 핀치줌 쪽 속도 문제로 생각되는데,  영상을 임의로 줄이는게 아니라 Layout의 background 이미지로 설정하고 LayoutParams 값을 zoom 입력 값에 따라 조절하여 세팅하시는 방식으로 구현하시면, 렌더러에서 이미지 사이즈를 조절하기 때문에, cpu를 통해 bitmap size를 매번 줄여 설정하는 방식보다 빠를 것으로 생각됩니다.  

 

익명사용자 님이 2017년 1월 19일 답변
조언 감사합니다. 지금까지 사용해 본 대부분의 오픈 소스(PhotoView, ImageViewTouch, Zoomage, FrescoImageView)들이 말씀하신 방식을 따르지 않을까 생각되는데요. 고해상도 이미지를 대상으로 테스트 했을 때 움직임이 비교적 원활한 녀석들은 이미지를 다운스케일 해서 불러오는 식이구요. 원본 그대로의 이미지를 가져온 녀석들은 버벅거림이 있습니다. 특히 줌 아웃 상태로 갈수록 많이 버벅거림이 심해지는데, 최대로 줌 아웃된 상태에서 ViewPager의 페이지 전환하는 모션 역시 원활해야 한다는 것이 문제입니다.
...