2012-06-11 34 views
5

Tôi đang cố gắng tải jpg vào một imagelist bằng cách chuyển đổi .jpg thành bmp rồi lưu nó vào imagelist1.Đang tải hình ảnh lên TImageList và Đọc chúng?

Từ trên xuống dưới của mã chụp. Các bộ phận Selectdir hoạt động và các bộ phận làm việc theo nhóm. Điều này được sử dụng để tải trong tất cả các hình ảnh trong một thư mục.Tất cả các hình ảnh được đặt tên như vậy 0.jpg/1.jpg ect ..

Sau đó tôi tải jpg thành hình ảnh. Đặt chiều rộng/chiều cao bmp và tải bmp với cùng một hình ảnh như jpg, sau đó tôi thêm bmp vào imagelist. Và khi hoàn thành nó sẽ hiển thị hình ảnh đầu tiên 0.jpg

Hai vấn đề, đầu tiên nếu tôi làm như vậy nó sẽ chỉ hiển thị một khu vực nhỏ (trên cùng bên trái) của bmp nhưng đó là hình ảnh chính xác. Tôi cho rằng điều này là do tùy chọn cắt. mà tôi không thể dường như tìm ra cách để làm cho nó chọn trung tâm trong thời gian chạy?

Thứ hai, Nếu tôi đặt

Imagelist1.width := currentimage.width; 
Imagelist1.height := currentimage.height; 

Sau đó nó cho thấy hình ảnh cuối cùng. như Imagelist1.GetBitmap() không hoạt động? vì vậy tôi giả định một sửa chữa cho một trong hai sẽ là tuyệt vời! cổ vũ squills

procedure TForm1.Load1Click(Sender: TObject); 
var 
openDialog : TOpenDialog; 
dir :string; 
MyPicture :TPicture; 
currentimage :Tbitmap; 
image : integer; 
clTrans : TColor; 
begin 
    Image := 0 ; 
    //lets user select a dir 
SelectDirectory(Dir, [sdAllowCreate, sdPerformCreate, sdPrompt],SELDIRHELP); 
    myPicture :=Tpicture.Create; 
    currentimage := TBitmap.Create; 
//keeps adding images as long as the file path exsist. 
//thus comic pages should be renumbed to 0-XX 
    while FileExists(Dir+'\'+inttostr(image)+'.jpg') do 
    begin 
    try 
    MyPicture.LoadFromFile(Dir+'\'+inttostr(image)+'.jpg'); //load image to jpg holder 
    currentimage.Width := mypicture.Width;  //set width same as jpg 
    currentimage.Height:= mypicture.Height;  //set height same as jpg 
    currentimage.Canvas.Draw(0, 0, myPicture.Graphic);  //draw jpg on bmp 
    clTrans:=currentimage.TransparentColor;   //unknown if needed? 
    //Imagelist1.Width := currentimage.Width; 
    //imagelist1.Height := currentimage.Height; 
    Imagelist1.Addmasked(Currentimage,clTrans);  //add to imagelist 
    finally 
    image := image +1;       //add one so it adds next page 
    end; 
end; 
ImageList1.GetBitmap(0,zImage1.Bitmap); 
mypicture.Free; 
currentimage.Free; 
end; 

Trả lời

2

Bạn đang thêm rất nhiều chi phí không cần thiết bằng cách sử dụng các TImage mỗi lần.

Hãy thử một cái gì đó như thế này (chưa được kiểm tra, bởi vì tôi không có một thư mục đầy đủ các hình ảnh được đặt tên theo cách này - nó biên dịch, mặc dù <g>). Bạn sẽ cần phải thêm Jpeg vào điều khoản thực thi của bạn, nếu tất nhiên là nó chưa có ở đó.

procedure TForm2.Button1Click(Sender: TObject); 
var 
    DirName: string; 
begin 
    DirName := 'D:\Images'; 
    if SelectDirectory('Select Image Path', 
        'D:\TempFiles', 
        DirName, 
        [sdNewUI], 
        Self) then 
    LoadImages(DirName); 
end; 

procedure TForm2.LoadImages(const Dir: string); 
var 
    i: Integer; 
    CurFileName: string; 
    JpgIn: TJPEGImage; 
    BmpOut: TBitmap; 
begin 
    i := 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 you haven't initialized your ImageList width and height, it 
     // defaults to 16 x 16; we can set it here, if all the images are 
     // the same dimensions. 
     if (ImageList1.Count = 0) then 
     ImageList1.SetSize(JpgIn.Width, JpgIn.Height); 

     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(0, BmpOut); 
     Image1.Picture.Assign(BmpOut); 
    finally 
     BmpOut.Free; 
    end; 
    end; 
end; 
+0

tính năng này hoạt động, đến khi tải xong, nó không hiển thị bất kỳ hình ảnh nào. tôi cũng phải thay đổi image1 thành ZImage1.bitmap.assign (bmpout); Vì ZImage1 là một lớp từ TGraphicControl. không chắc chắn nếu điều này quan trọng .. –

+0

nó dường như không bao giờ nhận được vào vòng lặp while. Luôn luôn phá vỡ ra –

+0

Không có cách nào (ngắn của một ngoại lệ bạn đang bỏ qua) rằng nó không thể nhận được vào vòng lặp 'while' nếu chức năng được gọi; 'trong khi True' luôn là' True'. Cách duy nhất mà mã sẽ không thực thi nó là nếu 'SelectDirectory' trả về false và hàm này không được gọi là kết quả. Trình gỡ rối hiển thị cho bạn điều gì nếu bạn đặt một điểm ngắt trên dòng đó? –

Các vấn đề liên quan