2012-06-11 4 views
5

Я пытаюсь загрузить jpg в imagelist, преобразовывая .jpg в bmp, а затем сохраняя его в imagelist1.Загрузка изображений в TImageList и чтение их?

Сверху вниз код снип. Работает функция Selectdir и файлы fileexists. Это используется для загрузки во все Изображения в папке. Все изображения названы так. 0.jpg/1.jpg ect ..

Затем я загружаю jpg в tpicture. Задайте ширину/высоту bmp и загрузите BMP с тем же изображением, что и jpg, затем добавьте BMP в изображение. И когда это будет сделано, он должен показать первый снимок. 0.jpg

Два вопроса, сначала, если бы я сделал это так, чтобы он отображал только небольшую область (вверху слева) bmp , но это было правильное изображение. Я предполагаю, что это связано с возможностью урожая. что я не могу понять, как заставить его выбрать центр во время выполнения?

Во-вторых, если я поставил

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

Затем он показывает последнее изображение. Imagelist1.GetBitmap() не работает? , поэтому я предполагаю, что исправление для любого из них было бы замечательным! веселит

морского лука
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; 

ответ

2

Вы хотите добавить много ненужных накладных расходов, используя TImage каждый раз.

Попробуйте что-нибудь подобное (непроверено, потому что у меня нет папки с изображениями, названными таким образом - она ​​компилируется, хотя <g>). Вам нужно добавить Jpeg к вашей реализации. uses пункт, если он еще не существует, конечно.

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

это действительно работает, в определенный момент, после его загрузки он не показывает никакого изображения. также мне пришлось изменить image1 на ZImage1.bitmap.assign (bmpout); Поскольку ZImage1 является классом от TGraphicControl. не уверен, если это имеет значение. –

+0

кажется, что он никогда не попадает в цикл while. Всегда вырывается –

+0

Нет способа (за исключением того, что вы игнорируете), что он не может попасть в цикл while, если вызываемая функция; 'while True' всегда' True'. Единственный способ, которым этот код не выполнял, - это если 'SelectDirectory' возвращает false, и функция не вызывается в результате. Что показывает отладчик, если вы установите точку останова на этой строке? –