Resampler = new TKernelResampler;
Resampler->Bitmap = src;
src->Resampler->Kernel = new TLinearKernel;
대강 이런 코드가 아닐련지요. 빌더쪽은 잘 몰라서 맞는지는 모르겠네요.
Jooni 님이 쓰신 글 :
: 먼저 답변 감사 드립니다. 그런데,
:
: TKernelResampler.Create(Src);
:
:
: 바로 이 코드가 문제 입니다. 도저히 C++ 로 코드를 이전하는 방법을 모르겠습니다. 달아주신 주석을 참고하여 살펴보면,
:
:
src->Resampler = new TKernelResampler();
: src->Resampler->Kernel = new TLanczosKernel();
:
: 정도로 해석해 볼 수 있을 것 같은데...(Switch를 이용하여 커널 모드를 선택하는 구문은 제외하고) 실제 이 코드는 에러를 유발하더군요. Resampler는 TCustomResampler로서, TKernelSampler 처럼 Kernel 필드를 가지고 있지 않아서 TLanczosKernel을 할당할 수 없기 때문입니다.
:
: 오랜만에 C++를 하려니 머리가 굳어 회전도 되지 않는데 Pascal 소스까지 보려니 완전 메롱한 상태가 되네요.
:
:
: 김도완 님이 쓰신 글 :
: : GR32를 커널리샘플러를 사용하는 방법은 델파이에서는 다음과 같습니다.
: :
: :
: : procedure SmoothResize32(Src, Dst: TBitmap32; thx: TAloneThread);
: : begin
: : // 1. 소스 비트맵을 파라미터로 하는 커널리샘플러를 생성한다.
: : TKernelResampler.Create(Src);
: : // 2. 커널리샘플러에 해당 리샘플러를 생성하여 할당한다.
: : case mResizeMode of
: : 1: TKernelResampler(Src.Resampler).Kernel := TLinearKernel.Create;
: : 2: TKernelResampler(Src.Resampler).Kernel := TLanczosKernel.Create;
: : 3: TKernelResampler(Src.Resampler).Kernel := TCosineKernel.Create;
: : 4: TKernelResampler(Src.Resampler).Kernel := TCubicKernel.Create;
: : 5: TKernelResampler(Src.Resampler).Kernel := TSplineKernel.Create;
: : end;
: : // 3. 다른 크기의 대상 비트맵인 Dst에 이미지를 그린다.
: : Dst.Draw(Dst.BoundsRect, Src.BoundsRect, Src);
: : end;
: :
: :
: : 이미지 소스인 Src 비트맵에 해당 리샘플러가 적용되야 합니다.
: :
: : 참고하셔요.
: :
: :
: : Jooni 님이 쓰신 글 :
: : :
: : : procedure DrawSrcToDst(Src, Dst: TBitmap32);
: : : var
: : : R: TKernelResampler;
: : : begin
: : : R := TKernelResampler.Create(Src);
: : : R.Kernel := TLanczosKernel.Create;
: : : Dst.Draw(Dst.BoundsRect, Src.BoundsRect, Src);
: : : end;
: : :
: : :
: : :
void TForm1::fitToImage(TBitmap32* dst, TBitmap32* src) {
: : : TKernelResampler *kr = new TKernelResampler();
: : : kr->TableSize = 32;
: : : kr->Bitmap = new TBitmap32();
: : : kr->Bitmap->Assign(src);
: : : kr->Kernel = new TLanczosKernel()
: : : dst->Draw(dst->BoundsRect(), src->BoundsRect(), src);
: : : }
: : :
: : : 섬네일과 유사한 효과를 얻기 위해서 정해진 크기로 이미지를 빠르게 축소하는 느낌의 코드를 만들고 싶습니다. fit Size를 주고 거기에 마춰서 폭이 크다면 폭을 기준으로, 길이가 크다면 길이를 기준으로 크기를 계산합니다. 이후에 이미지를 빠르게 축소를 해야하는데, 위 코드는 Graphics32에서 얻은 (또한 설치되어 있는) 이미지 리샘플링 소스 입니다.
: : :
: : : 그런데 이렇게 하면 작동하지 않고, 실제로 dst의 draw 영역을 SetSize로 잡아주면 자동으로 축소된 그림이 나오지만 그렇게 하면 계단 현상이 너무 심해서 위의 샘플러를 적용하고 싶습니다.
: : :
: : : 델파이 코드를 잘못 쓴것 같은데 gr32_resampler.pas 파일을 열어봐도, 부모클래스의 생성자를 실행하고, Tabsize만 지정할 뿐 별다른 역활을 하지 않기에 C++ 코드를 저리 썼는데 전혀 샘플러가 작동하지 않습니다.
: : :
: : : 답변좀 부탁드립니다.