Q&A

  • Listvew에 이미지를 뿌리는데요 비율에 맞게 이미지를 줄일수 없나요
아래처럼 Listview에 이미지를 넣는데요
Bitmap이 일괄적으로 사이즈가 정해지니까 그안에 맞게 찌그러진체 이미지를 넣어버리네요

비율에 맞게 줄여서 넣는 방법이 없을까요


procedure TForm1.addViewList(FileName : string);
var
tmpJpg : TJPEGImage;
Bitmap1 : TBitmap;
Bitmap2 : TBitmap;
ThumbList: TListItem;
aaa : integer;
begin
ThumbList := ListView1.Items.Add;
ImageList1.Width := 150;
ImageList1.Height := 150;
Bitmap1 := TBitmap.Create;
Bitmap1.Width  := ImageList1.Width;
Bitmap1.Height := ImageList1.Height;
Bitmap2 := TBitmap.Create;

if LowerCase(ExtractFileExt(FileName)) = '.bmp' then
begin
   Bitmap2.LoadFromFile(FileName);
end else if LowerCase(ExtractFileExt(FileName)) = '.jpg' then
begin
   tmpJpg := TJPEGImage.Create;
   tmpJpg.LoadFromFile(FileName);
   Bitmap2.Assign(tmpJpg);
   tmpJpg.Free;
end;

Bitmap1.Canvas.StretchDraw(Bitmap1.Canvas.ClipRect, Bitmap2);
ThumbList.Caption := FileName;
ThumbList.ImageIndex := ImageList1.Add(Bitmap1, nil);

Bitmap2.Free;
Bitmap1.Free;
end;
1  COMMENTS
  • Profile
    석주현 2004.09.03 06:42
    procedure TForm1.addViewList(FileName : string);
    var
      tmpJpg        : TJPEGImage;
      Bitmap1       : TBitmap;
      Bitmap2       : TBitmap;
      ThumbList   : TListItem;
      aaa             : integer;
      tmpRect       : TRect;
      tmpHeight     : Integer;
      tmpWidth      : Integer;
    begin
      ThumbList             := ListView1.Items.Add;
      ImageList1.Width      := 150;
      ImageList1.Height     := 150;

      Bitmap1               := TBitmap.Create;
      Bitmap1.Width         := ImageList1.Width;
      Bitmap1.Height        := ImageList1.Height;
      Bitmap2               := TBitmap.Create;

      if LowerCase(ExtractFileExt(FileName)) = '.bmp' then
        begin
          Bitmap2.LoadFromFile(FileName);
        end
      else if LowerCase(ExtractFileExt(FileName)) = '.jpg' then
        begin
          tmpJpg := TJPEGImage.Create;
          tmpJpg.LoadFromFile(FileName);
          Bitmap2.Assign(tmpJpg);
          tmpJpg.Free;
        end;

    //////////////////////////////////////////////////////////////
    // 고친 부분 입니다..
    // 보통 섬네일 그림을 만들때는 비율을 같게 맞춰줘야 합니다.
    // 가로가 긴그림 세로가 긴그림 각각 긴쪽을 기준으로 맞추면 됩니다.
    /////////////////////////////////////////////////////////////

      if Bitmap2.Width > Bitmap2.Height then // 가로가 긴경우
        begin
          tmpRect.Left   := 0;                         // 가로는 기니깐
          tmpRect.Right  := ImageList1.Width;  // 최고길이로 셋팅
    // 아래부턴 세로의 길이를 어떻게 할지 계산
          tmpHeight      := round(ImageList1.Width / Bitmap2.Width * Bitmap2.Height);
          tmpRect.Top    := round((ImageList1.Height - tmpHeight) / 2);
          tmpRect.bottom := tmpRect.Top + tmpHeight;
        end
      else   // 세로가 긴경우
        begin
          tmpRect.Top    := 0;     // 세로는 최대 길이로 셋팅
          tmpRect.Bottom := ImageList1.Height;
    // 가로 비율 맞춘다.
          tmpWidth       := round(ImageList1.Height / Bitmap2.Height * Bitmap2.Width);
          tmpRect.Left   := round((ImageList1.Width - tmpWidth) / 2);
          tmpRect.Right  := tmpRect.Left + tmpWidth;
        end;
    // 위에서 구해진 사각형에 그림을 그린다.
    // 보통 이경우 바탕을 먼저 한번 사각형을 그려 채워 주세요.
    // 회색 같은걸로 채우고 테두리를 그려주면 ACDSEE 같은 모양도 만들수
    // 있습니다.. ^^
      Bitmap1.Canvas.StretchDraw(tmpRect, Bitmap2);

      ThumbList.Caption := FileName;
      ThumbList.ImageIndex := ImageList1.Add(Bitmap1, nil);

      Bitmap2.Free;
      Bitmap1.Free;
    end;