2012-06-12 5 views
0

이미지 iam로드는 약간 다른 크기입니다. 가장 작은 크기를 얻고 크기에 맞게 다시 크기를 조정하려면 어떻게해야합니까?다른 크기의 이미지로드 TImageList

아래 코드 이미지의로드 ->이 에러 무효 이미지 크기를 제공 약 3 잔상

를 이미지리스트에 추가 -> BMP로 변환. 처음에는 imagelist에게 준 크기만큼 이미지 크기가 너무 크기 때문입니다. 당신이 TImageList에 이미지를 넣어 시작하면

procedure TForm1.LoadImages(const Dir: string); 
var 
    z,i: Integer; 
    CurFileName: string; 
    JpgIn: TJPEGImage; 
    BmpOut: TBitmap; 
begin 
    i := 0; 
    z := 1; 
    while True do 
    begin 
    CurFileName := Format('%s%d.jpg', 
          [IncludeTrailingPathDelimiter(Dir), i]); 
    if not FileExists(CurFileName) then 
     Break; 
    JpgIn := TJPEGImage.Create; 
    try 
     JpgIn.LoadFromFile(CurFileName); 
     if z = 1 then 
     begin 
     ImageList1.SetSize(jpgin.width, jpgin.Height); 
     z := 0; 
     end; 
     BmpOut := TBitmap.Create; 
     try 
     BmpOut.Assign(JpgIn); 
     ImageList1.Add(BmpOut, nil); 
     finally 
     BmpOut.Free; 
     end; 
    finally 
     JpgIn.Free; 
    end; 
    Inc(i); 
    end; 
    if ImageList1.Count > 0 then 
    begin 
    BmpOut := TBitmap.Create; 
    try 
     ImageList1.GetBitmap(1, BmpOut); 
     zimage1.Bitmap.Assign(bmpout); 
     zimage1.Repaint; 
    finally 
     BmpOut.Free; 
    end; 
    end; 
end; 
+0

내가 본 것 TImageList를 발생한 최대 크기로 설정 한 다음 개별 이미지의 종횡비를 벗어나는 픽셀을 투명 배경색으로 설정할 수 있습니다. 그러나 이것을 위해 나는 아직도 최대 크기 encounterd를 알 필요가있을 것이다. 어느 때마다 달라질 수 –

+0

나중에 참조 할 수 있도록 사용중인 코드에 대한 이전 질문에 방금 연결했을 수 있으며 여기에서 후속 질문을 요청할 수 있습니다. 레미는 해결책을 제시했습니다. 나는 그 문제를 설명 할 것이다. 이미지 추가를 시작한 후에도 이미지 목록 크기를 변경하면 이미지 목록이 지워 지므로 크기를 변경할 수 없습니다. 따라서 이미지 목록이 내부적으로 단일 와이드 이미지 (첫 번째 이미지의 너비에 이미지 수를 곱한 값)로 구현되므로 다른 크기의 이미지를 추가하면 예외가 발생합니다. Obviouly, 그러면, 이것은 크기가 작은 이미지로 실패합니다. –

답변

1

, 당신은 크기를 조정할 수 없으며, 모든 이미지 크기가 동일해야합니다. 따라서 사전에 모든 이미지를 미리로드해야 사용할 수있는 가장 작은 크기를 결정한 다음 큰 이미지를 더 작은 크기로 자르거나 늘린 다음 TImageList에 최종 이미지를로드 할 수 있습니다.

은 바로 그들을 무료 TList 또는 TObjectList 아니라으로 다음 수있는 작은 크기, 다시 필요에 따라 이미지 크기를 조정 목록을 통해 다음 루프를 계산하는 그 목록을 반복하고 루프를 TJPEGImage의 모든 루프 매장을 가지고 목록을 통해 TImageList에 이미지를 다시 추가 한 다음 마지막으로 목록을 반복하여 이미지를 해제합니다.

+1

+1. 물론이 작업은 모든 것을 가장 작은 것으로 확장하려는 경우에 효과적입니다. 가장 큰 이미지를 사용하고 싶다면 같은 크기의 빈 이미지를 만들고 투명 색상으로 채우기를 수행 한 다음 작은 이미지를 올바른 위치에 복사하십시오. (내가 가장 작은 것에 대해 물어 본 질문을 알고 있습니다. 누군가가 물기 전에이 글을 나중에 게시하기를 원합니다.) –

+0

그게 무슨 일인가? 첫 번째 jpg 이미지로 imagelist의 너비 설정. 그런 다음 bmpOut을 만들 때. 그 너비를 imagelist 너비/높이의 너비/높이로 설정합니까? 내가 지금 한 일에 대한 대답으로 아픈 업데이트? –

+0

첫 번째 jpg 이미지가 가장 작지 않을 수 있으므로 먼저 다른 모든 이미지를 검사 할 때까지 ImageList 크기를 해당 크기로 설정할 수 없습니다. –