|
도스때 프로그램 만들때의 기역을 되살려서^^
뭐 특별한 알고리즘이 있나요..그냥 축소 확대 하면 되죠?
일단 가로방향을 확대하고 세로방향으로 확대하면 되죠..
소스가 s_size 데스트가 d_size 라 할때
index table을 만듣다면
int*s_index=new int[s_size];
int*d_index=new int[d_size];
for(int i=0;i<s_size;i++) s_index[i]=i;
for(int i=0;i<d_size;i++) d_index[i]=s_index[(int)(s_size*i/d_size)];
이렇게 하면 d_index[] 가 소스에 대한 확대 인덱스 테이블이 되겠지요?...
소스의 한라인 확대 루틴
void mul_line(int *s,int*d) s=소스 d=데스트
{
for(int i=0;i<d_size;i++){
d[i]=s[d_index[i]];
}
}
한라인이 확대되었으므로 같은방식으로 세로방향도 처리합니다.
세로인뎃으를 만들어서 그인덱스에 따라 한라인을 그대로 복사 삽입하면 되겠죠.
그렇게 계속 하면되겠지요?...
축소도 마찬가지구요...
인넥스를 안 만들고 할수도 있지만
이런류의 작업은 속도가 매우 중요하므로 인덱스를 만들어 써야죠..
루프에 들어가는 부분을 최적화해주셔야 할겁니다.속도차이가 엄청나지요..
보통 640*480 24비트 데이터라면 640*480*3=921600 번 푸프를 돌아야 하는데..
그안의 처리를 0.00001초 시간이 더들어가게 코딩했다면
결과는 10초나 차이가 생깁니다.^^
김인구.구야 님이 쓰신 글 :
: 비트맵을 축소/확대 해볼려고 합니다.
: API함수(StretchDIBits)를 이용하지 않고 만들어 볼려고합니다.
: 현재 비트맵파일을 DIB구조에 따라 읽는데 까지 한 상태입니다.
: 래스터 데이타를 요리하고 헤더를 수정해서 WriteFile하면 될꺼 같습니다만
: 래스터 데이타를 어떻게 요리해야할지 막막한 상태입니다...
: StretchDIBits함수는 어떤 알고리즘으로 축소/확대를 하는지 궁금합니다.
: 제가 알고리즘을 만든다는건 불가능할꺼 같기도 하고...
: 일단 StretchDIBits가 하는 방식으로 구현을 해볼려고 합니다.
: 직접 알고리즘을 만들어 보신분들의 조언을 구합니다.
: 이런 알고리즘을 생각할때
: 어디서 어떻게 시작을 해야하고 어떻게 생각을 해야하는지요...
: 당장 생각으론 제 수학 실력으론 불가능할꺼 같기도 합니다만...
:
|