아래처럼 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;
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;