window환경은 아닌가 보죠?
window환경이라면
그냥 StretchBlt통해 확대하고
StretchBlt 함수 호출전에 SetStretchBltMode(HALFTONE); 해놓구 하면 비교적 부드럽게 확대 축소 됩니다.
TImage에서 StrectDraw에 이방식을 씁니다.
window환경이 아니면..
직접 보정 알고리즘을 써야 하는데요...
최접근 이웃 보간이나 양선영보간 등이 있습ㄴ디ㅏ.
최접근 이웃 보간
은 원본 위치에서 가장 가까운 위치에 값으 가져와서 대입합니다.
어떤 이미지를 2.5 배 확대한다고 할때
확대한 이미지 (x,y) 의 값은 ( x / 2.5 , y/2.5 )
func(x,y)
NewImage(X,Y ) = OriginalImage ( RoundTo(x /2.5,-1) ) , RoundTo( y / 2.5 , -1 ) ) ; 이 되는거죠
RoundTo(xxx, -1 ) 은 소숫점 1자리에서 반올림 하는것입니다.
저 func(x,y) 를 확대한 이미지의 모든 pixcel에 대해 루트 돌리면 되죠
근데 저방식은 별루예요
양선영 보간
양선영 보간은 가장 가까운 pixcel을 값을 가져오지 않고
주변 4 픽셀 또는 그이상의 값을 가지고 가중치를 두어서 더하여 가져옵니다.
float fX,fY
fX = X / 2.5 ;
fY = Y / 2.5 ;
int iX=fX;
int iY=fY;
float fdX=fX-iX;
float fdY=fY-iY;
NewImage(X,Y) =OriginalImage(iY,iX)*(( 1-fdX)*(1-fdY)) \
+ OriginalImage(iY,iX+1]*(( 1-fdX)*fdY) \
+ OriginalImage((iY+1),+iX+1)*(fdX*fdY) \
+ OriginalImage((iY+1),+iX)*(fdX*(1-fdY));
이런식으로..
그밖에도 다른 방법들이 많이 있을것입니다.
그럼..
땅주인 님이 쓰신 글 :
: 차량용 DVR을 제작중입니다.
: 영상 인코딩은 H.264를 사용하구요..
: 뷰어에서.. H.264로 인코딩된 스트림을 PixTree Codec를 이용해서
: RGB포멧으로 뽑아냅니다. 그것을 Bitmap으로 변환해서 .. 화면 사이즈에 맞게 출력을 하는데..
:
: 문제는, Bitmap으로 변환 한 후에 화면 사이즈에 맞게 확대해서 출력하니 (CxImage 라이브러리 사용합니다),
: Bitmap 확대할 때 생기는 계단 현상이 보여 화질이 좋지 않습니다. 시장에
: 내놓았다가는 쪽박차기 딱이죠..
:
: 그래서, 새로운 코덱을 찾고 있는데요..
: H.264를 지원하고 화면 사이즈를 지정하면 그거에 맞게 알아서 영상 디코딩해서
: 고화질로 영상을 만들어 주는 Codec이 필요합니다.
:
: 아니면, Bitmap으로 뽑아서, DirectShow의 화질보정해주는 필터(아직 어떤 건 지 모름)가
: 있다면 이를 이용해서 구현해 보고도 싶습니다.
:
: 이도저도 아니면, 비트뱁 영상을 확대할 때 영상을 보정해주는 라이브러리가 있는 지?
: 우쨌거나 원 소스의 화질을 보정해 줄 수 있는 어떤 뭉툭한 방법이 필요합니다.
: 조언을 좀...
:
: 이런 상황에서 어떻게 해야 할 지 ... 고수님들의 의견 바랍니다.
:
: 감사합니다.