알고리즘

현재 화면에 맞춰 이미지 크기 변경

조규현15 2015. 2. 10. 11:34
반응형

CRect Rect;

GetClientRect(&Rect);

float width = Rect.right-Rect.left, height = Rect.bottom-Rect.top;

float rect_rate = width/height, img_rate = (float)image.GetWidth()/(float)image.GetHeight();


int priority_range = 

((img_rate > rect_rate && img_rate < 1)

||(img_rate < rect_rate && img_rate >= 1)) ? 1 : 0 ;

if(priority_range) width = height * img_rate;

else height = width / img_rate;


Rect.left=0;Rect.right = (int)width;Rect.top=0;Rect.bottom=(int)height;


> 예제는 MFC에서 읽어들인 Img의 size를 현재 view의 크기에 맞춰 보여준다.


이미지를 화면에 맞춰 보여줄 경우가 있다.

그럴 때 화면에 그림이 잘려나가지 않고 비율(scale)을 유지하면서 꽉 채운 화면을 보여주는게 효율적이다.


우리에겐 2개의 영역이 있다.

Rect // 보여줄 화면의 상, 하, 좌, 우 위치

Img_rect // 보여질 그림의 상, 하, 좌, 우 위치

// 그림의 width와 height을 말하는 것이다.


각각의 영역은 고유하게 존재하며 두가지 경우가 있다.



1. Rect > Img_rect 

화면의 크기가 이미지보다 크기에 이미지의 비율이 1.0이상이 되어야한다.


2. Rect < img_rect

화면의 크기가 이미지보다 작기에 이미지의 비율이 1.0보다 작아야한다.


각 영역은 rate = width/ height로 표현가능하다.

Img를 Rect(화면)에 맞출 경우 잘리지 않으려면 Img의 rate를 유지해야한다.


img_rate가 rect_rate보다 큰 경우 img_rate가 1보다 작으면 (height 위주의 이미지) height을 고정해야하며

img_rate가 rect_rate보다 작은 경우 img_rate가 1이상이면 height을 고정해야한다.

반대의 경우, width고정을 하면 된다.


Tip. 만약, 가운데 정렬을 원한다면 Rect.left 와 Rect.top을 ( Rect.width - image.width / 2 ),  ( Rect.height - image.height / 2 )으로 넣어준다.


> 수정

//7번 라인 아래 추가되어야 한다.

if( img_rate < 1 ) priority_range = 1 - priority_range;


Tip의 경우 아래와 같다.

int interval_x = (Rect.right-(int)width)/2,interval_y = (Rect.bottom-(int)height)/2;

Rect.left=interval_x;Rect.right = (int)width+interval_x;Rect.top=interval_y;Rect.bottom=(int)height+interval_y;


반응형

'알고리즘' 카테고리의 다른 글

더블 버퍼링  (0) 2015.02.12
임의의 순서로 이루어진 순열 얻기  (0) 2015.02.10
XOR 교체 알고리즘  (0) 2015.01.29
오브젝트를 생성하고 삭제하는 문제  (0) 2015.01.08
충돌범위  (0) 2015.01.08