Q&A

  • 비트맵을 리사이즈...!
비트맵을 화면크기(판넬)크기에 맞추어 리사이즈 할려고 어제 밤부터 내내 헤메었지만 도저히 몰겠습니다.



#리사이즈(원래크기의 비트맵을 화면크기(판넬)에 맞추어 배율 그대로 축소하거나 확대)



도움을 부탁드립니다.

델초보가 고수님들의 고견을 기다립니다.

3  COMMENTS
  • Profile
    최용일 2000.03.20 09:03
    아래와 같이 DC(TCanvas.Handle)의 맵핑모드를 바꾸어주시면 됩니다.



    함수에 대한 자세한 설명은 도움말을 보세요...



    var

    R:TRect;

    Source: TBitmap; // 원본 이미지

    Dest: TBitmap; // 확대or축소된 이미지

    begin

    ...

    // 확대or축소하고자 하는 크기, 아래의 경우는 Panel1의 크기에 맞춘다.

    Dest.Width := Panel1.Width;

    Dest.height := Panel1.Height;



    SetMapMode(Dest.Canvas.Handle, MM_ANISOTROPIC);

    SetWindowExtEx(Dest.Canvas.Handle, Source.Width, Source.Height, nil);

    SetViewportExtEx(Dest.Canvas.Handle, Dest.Width, Dest.height, nil);



    R := Rect(0, 0, Source.Width, Source.Height);

    Dest.Canvas.CopyRect(R, Source.Canvas, R);

    ...

    end;

  • Profile
    최진실 2000.03.20 08:40
    초용일님 답변을 올려주셔서 감사합니다.

    올려주신 코드를 약간 수정해서 그렸습니다.



    근데 하얀여백이 그려집니다.

    이걸없앨수 없습니까.

    Dest.Height와 Width를 구해보니까 여백을 포함한 길이가 나옵니다.



    제가 원하는 것은 이미지를 축소하여 Center모드나 Tile모드로 그려주고 싶습니다.



    제가 초보라서 좀 무지한 질문을 많이 합니다.

    그렇지만 이해해 주시기 바랍니다. (계속 이 Hint를 쓰는 것 같습니다.)



    델초보가...



    var

    R:TRect;

    Source: TBitmap; // 원본 이미지

    Dest: TBitmap; // 확대or축소된 이미지

    begin

    if Pic.Bitmap.Width = 0 then Exit;

    Source:=Pic.Bitmap;



    Dest:=TBitmap.Create;

    Dest.Width := Panel7.Width;

    Dest.height := Panel7.Height;



    SetMapMode(Dest.Canvas.Handle, MM_ISOTROPIC);

    SetWindowExtEx(Dest.Canvas.Handle, Source.Width, Source.Height, nil);

    SetViewportExtEx(Dest.Canvas.Handle, Dest.Width, Dest.height, nil);



    //Dest.Canvas.FloodFill(0, 0, 0, fsBorder);

    Dest.Canvas.FillRect(Image1.ClientRect);



    R := Rect(0 ,0 , Source.Width, Source.Height);

    Dest.Canvas.Draw(0,0,Source);





    Image1.Picture.Bitmap.Assign(Dest);



    Dest.Destroy;







    최용일 wrote:

    > 아래와 같이 DC(TBitmap.Canvas.Handle)의 맵핑모드를 바꾸어주시면 됩니다.

    >

    > 함수에 대한 자세한 설명은 도움말을 보세요...

    >

    > var

    > R:TRect;

    > Source: TBitmap; // 원본 이미지

    > Dest: TBitmap; // 확대or축소된 이미지

    > begin

    > ...

    > // 확대or축소하고자 하는 크기, 아래의 경우는 Panel1의 크기에 맞춘다.

    > Dest.Width := Panel1.Width;

    > Dest.height := Panel1.Height;

    >

    > SetMapMode(Dest.Canvas.Handle, MM_ANISOTROPIC);

    > SetWindowExtEx(Dest.Canvas.Handle, Source.Width, Source.Height, nil);

    > SetViewportExtEx(Dest.Canvas.Handle, Dest.Width, Dest.height, nil);

    >

    > R := Rect(0, 0, Source.Width, Source.Height);

    > Dest.Canvas.CopyRect(R, Source.Canvas, R);

    > ...

    > end;

  • Profile
    최용일 2000.03.20 09:29
    저는 최용일입니다. 초용일이 아님니다.



    아래의 소스만으론 이상이 없습니다. 원본 비트맵을 확인해 보세요...

    > Source:=Pic.Bitmap; // <-- Pic.Bitmap이 제대로 그려지나 확인해 보세요.

    > ...

    > Dest.Canvas.Draw(0,0,Source); // <-- CopyRec을 쓰세요...



    위의 부분말고는 소스상의 이상한 점은 없는것 같습니다.



    일단 축소된 비트맵 이미지를 가지고 있다면 센터/타일을 그리 어려운 일이

    아닌데요... 센터는 중간값을 구해서 가운데에다 CopyRect으로 그려주고,

    타일은 for문을 이용해서 차례로 그려주는거죠. for문을 쓰실줄 아신다면

    조금만 생각하시면 하실 수 있습니다.



    최진실 wrote:

    > 최용일님 답변을 올려주셔서 감사합니다.

    > 올려주신 코드를 약간 수정해서 그렸습니다.

    >

    > 근데 하얀여백이 그려집니다.

    > 이걸없앨수 없습니까.

    > Dest.Height와 Width를 구해보니까 여백을 포함한 길이가 나옵니다.

    >

    > 제가 원하는 것은 이미지를 축소하여 Center모드나 Tile모드로 그려주고 싶습니다.

    >

    > 제가 초보라서 좀 무지한 질문을 많이 합니다.

    > 그렇지만 이해해 주시기 바랍니다. (계속 이 Hint를 쓰는 것 같습니다.)

    >

    > 델초보가...

    >

    > var

    > R:TRect;

    > Source: TBitmap; // 원본 이미지

    > Dest: TBitmap; // 확대or축소된 이미지

    > begin

    > if Pic.Bitmap.Width = 0 then Exit;

    > Source:=Pic.Bitmap;

    >

    > Dest:=TBitmap.Create;

    > Dest.Width := Panel7.Width;

    > Dest.height := Panel7.Height;

    >

    > SetMapMode(Dest.Canvas.Handle, MM_ISOTROPIC);

    > SetWindowExtEx(Dest.Canvas.Handle, Source.Width, Source.Height, nil);

    > SetViewportExtEx(Dest.Canvas.Handle, Dest.Width, Dest.height, nil);

    >

    > //Dest.Canvas.FloodFill(0, 0, 0, fsBorder);

    > Dest.Canvas.FillRect(Image1.ClientRect);

    >

    > R := Rect(0 ,0 , Source.Width, Source.Height);

    > Dest.Canvas.Draw(0,0,Source);

    >

    >

    > Image1.Picture.Bitmap.Assign(Dest);

    >

    > Dest.Destroy;

    >

    >

    >

    > 최용일 wrote:

    > > 아래와 같이 DC(TBitmap.Canvas.Handle)의 맵핑모드를 바꾸어주시면 됩니다.

    > >

    > > 함수에 대한 자세한 설명은 도움말을 보세요...

    > >

    > > var

    > > R:TRect;

    > > Source: TBitmap; // 원본 이미지

    > > Dest: TBitmap; // 확대or축소된 이미지

    > > begin

    > > ...

    > > // 확대or축소하고자 하는 크기, 아래의 경우는 Panel1의 크기에 맞춘다.

    > > Dest.Width := Panel1.Width;

    > > Dest.height := Panel1.Height;

    > >

    > > SetMapMode(Dest.Canvas.Handle, MM_ANISOTROPIC);

    > > SetWindowExtEx(Dest.Canvas.Handle, Source.Width, Source.Height, nil);

    > > SetViewportExtEx(Dest.Canvas.Handle, Dest.Width, Dest.height, nil);

    > >

    > > R := Rect(0, 0, Source.Width, Source.Height);

    > > Dest.Canvas.CopyRect(R, Source.Canvas, R);

    > > ...

    > > end;