Advertisement
HemulGM

Untitled

Jan 3rd, 2020
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 4.37 KB | None | 0 0
  1. unit ImageViewer.ThumdWork;
  2.  
  3. interface
  4.  
  5. uses
  6.   Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  7.   Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ImgList,
  8.   Vcl.Grids, System.Generics.Collections, JPEG, PNGImage;
  9.  
  10. type
  11.   TThumbnailsWorker = class(TThread)
  12.   protected
  13.     procedure Execute; override;
  14.   public
  15.     Stopped: Boolean;  //Флаг завершенности потока
  16.   end;
  17.  
  18. implementation
  19.  
  20. uses
  21.   ImageViewer.Main;
  22.  
  23. { TThumbnailsWorker }
  24.  
  25. procedure TThumbnailsWorker.Execute;
  26. var
  27.   i: Integer;
  28.   WThumb, BMP128: TBitmap;
  29.   Next, DoBreak: Boolean;
  30.   Ext: string;
  31.   JPEG: TJPEGImage;
  32.   PNG: TPngImage;
  33.   FItem: TFileItem;
  34.   BRect: TRect;
  35. begin
  36.   Stopped := False;
  37.   while not Application.Terminated do
  38.   begin
  39.    //Ограничение использования ЦП времени
  40.     Sleep(100);
  41.     DoBreak := False;
  42.    //Проверка флагов списка
  43.     Synchronize(
  44.       procedure
  45.       begin
  46.         if FormMain.FFileList.Wait then
  47.           DoBreak := True;
  48.         FormMain.FFileList.Changed := False;
  49.       end);
  50.     if DoBreak then
  51.       Continue;
  52.  
  53.    //По всем элементам
  54.     for i := 0 to FormMain.FFileList.Count - 1 do
  55.     begin
  56.       Next := False;
  57.       DoBreak := False;
  58.      //Забираем элемент списка на обработку, если он не обработан
  59.      //Каждый раз проверяем, не изменился ли список
  60.       Synchronize(
  61.         procedure
  62.         begin
  63.           if FormMain.FFileList.Changed then
  64.             DoBreak := True;
  65.           if not DoBreak then
  66.           begin
  67.             FItem := FormMain.FFileList[i];
  68.             if Assigned(FItem.Thumbnail) then
  69.               Next := True;
  70.           end;
  71.         end);
  72.       if DoBreak then
  73.         Break;
  74.       if Next then
  75.         Continue;
  76.      //Загружаем файл
  77.       WThumb := TBitmap.Create;
  78.       BMP128 := TBitmap.Create;
  79.       BMP128.SetSize(128, 128);
  80.       Ext := AnsiLowerCase(ExtractFileExt(FItem.FullName));
  81.       try
  82.         if (Ext = '.jpg') or (Ext = '.jpeg') then
  83.         begin
  84.           JPEG := TJPEGImage.Create;
  85.           JPEG.LoadFromFile(FItem.FullName);
  86.           WThumb.Assign(JPEG);
  87.           JPEG.Free;
  88.         end;
  89.         if (Ext = '.png') then
  90.         begin
  91.           PNG := TPngImage.Create;
  92.           PNG.LoadFromFile(FItem.FullName);
  93.           WThumb.Assign(PNG);
  94.           PNG.Free;
  95.         end;
  96.         if (Ext = '.bmp') then
  97.         begin
  98.           WThumb.LoadFromFile(FItem.FullName);
  99.         end;
  100.       except
  101.       end;
  102.      //Если что-то загружено, делаем пропорциональную миниатюру
  103.       if not WThumb.Empty then
  104.       begin
  105.         BRect.Left := 0;
  106.         BRect.Top := 0;
  107.         if WThumb.Width > WThumb.Height then
  108.         begin
  109.           BRect.Width := 128;
  110.           BRect.Height := Round(WThumb.Height * (128 / WThumb.Width));
  111.         end
  112.         else if WThumb.Width < WThumb.Height then
  113.         begin
  114.           BRect.Height := 128;
  115.           BRect.Width := Round(WThumb.Width * (128 / WThumb.Height));
  116.         end
  117.         else
  118.         begin
  119.           BRect.Width := 128;
  120.           BRect.Height := 128;
  121.         end;
  122.         OffsetRect(BRect, Round((128 / 2) - (BRect.Width / 2)), Round((128 / 2) - (BRect.Height / 2)));
  123.         BMP128.Canvas.Brush.Color := clWhite;
  124.         BMP128.Canvas.Brush.Style := bsSolid;
  125.         BMP128.Canvas.FillRect(Rect(0, 0, 128, 128));
  126.         BMP128.Canvas.StretchDraw(BRect, WThumb);
  127.         WThumb.Free;
  128.       end;
  129.       DoBreak := False;
  130.      //Проверяем список и если всё ок, подменяем обработанный файл
  131.       Synchronize(
  132.         procedure
  133.         begin
  134.           if not FormMain.FFileList.Changed then
  135.           begin
  136.             FItem.Thumbnail := TBitmap.Create;
  137.             FItem.Thumbnail.Assign(BMP128);
  138.             FormMain.FFileList[i] := FItem;
  139.          //Посылаем команду на перерисовку сетки
  140.             FormMain.FFileList.Repaint;
  141.           end
  142.           else
  143.             DoBreak := True;
  144.         end);
  145.       BMP128.Free;
  146.       if DoBreak then
  147.         Break;
  148.     end;
  149.   end;
  150.   Stopped := True;
  151. end;
  152.  
  153. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement