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 |