Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- unit ImageViewer.ThumdWork;
- interface
- uses
- Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
- Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.ExtCtrls, Vcl.StdCtrls, Vcl.ImgList,
- Vcl.Grids, System.Generics.Collections, JPEG, PNGImage;
- type
- TThumbnailsWorker = class(TThread)
- protected
- procedure Execute; override;
- public
- Stopped: Boolean; //Флаг завершенности потока
- end;
- implementation
- uses
- ImageViewer.Main;
- { TThumbnailsWorker }
- procedure TThumbnailsWorker.Execute;
- var
- i: Integer;
- WThumb, BMP128: TBitmap;
- Next, DoBreak: Boolean;
- Ext: string;
- JPEG: TJPEGImage;
- PNG: TPngImage;
- FItem: TFileItem;
- BRect: TRect;
- begin
- Stopped := False;
- while not Application.Terminated do
- begin
- //Ограничение использования ЦП времени
- Sleep(100);
- DoBreak := False;
- //Проверка флагов списка
- Synchronize(
- procedure
- begin
- if FormMain.FFileList.Wait then
- DoBreak := True;
- FormMain.FFileList.Changed := False;
- end);
- if DoBreak then
- Continue;
- //По всем элементам
- for i := 0 to FormMain.FFileList.Count - 1 do
- begin
- Next := False;
- DoBreak := False;
- //Забираем элемент списка на обработку, если он не обработан
- //Каждый раз проверяем, не изменился ли список
- Synchronize(
- procedure
- begin
- if FormMain.FFileList.Changed then
- DoBreak := True;
- if not DoBreak then
- begin
- FItem := FormMain.FFileList[i];
- if Assigned(FItem.Thumbnail) then
- Next := True;
- end;
- end);
- if DoBreak then
- Break;
- if Next then
- Continue;
- //Загружаем файл
- WThumb := TBitmap.Create;
- BMP128 := TBitmap.Create;
- BMP128.SetSize(128, 128);
- Ext := AnsiLowerCase(ExtractFileExt(FItem.FullName));
- try
- if (Ext = '.jpg') or (Ext = '.jpeg') then
- begin
- JPEG := TJPEGImage.Create;
- JPEG.LoadFromFile(FItem.FullName);
- WThumb.Assign(JPEG);
- JPEG.Free;
- end;
- if (Ext = '.png') then
- begin
- PNG := TPngImage.Create;
- PNG.LoadFromFile(FItem.FullName);
- WThumb.Assign(PNG);
- PNG.Free;
- end;
- if (Ext = '.bmp') then
- begin
- WThumb.LoadFromFile(FItem.FullName);
- end;
- except
- end;
- //Если что-то загружено, делаем пропорциональную миниатюру
- if not WThumb.Empty then
- begin
- BRect.Left := 0;
- BRect.Top := 0;
- if WThumb.Width > WThumb.Height then
- begin
- BRect.Width := 128;
- BRect.Height := Round(WThumb.Height * (128 / WThumb.Width));
- end
- else if WThumb.Width < WThumb.Height then
- begin
- BRect.Height := 128;
- BRect.Width := Round(WThumb.Width * (128 / WThumb.Height));
- end
- else
- begin
- BRect.Width := 128;
- BRect.Height := 128;
- end;
- OffsetRect(BRect, Round((128 / 2) - (BRect.Width / 2)), Round((128 / 2) - (BRect.Height / 2)));
- BMP128.Canvas.Brush.Color := clWhite;
- BMP128.Canvas.Brush.Style := bsSolid;
- BMP128.Canvas.FillRect(Rect(0, 0, 128, 128));
- BMP128.Canvas.StretchDraw(BRect, WThumb);
- WThumb.Free;
- end;
- DoBreak := False;
- //Проверяем список и если всё ок, подменяем обработанный файл
- Synchronize(
- procedure
- begin
- if not FormMain.FFileList.Changed then
- begin
- FItem.Thumbnail := TBitmap.Create;
- FItem.Thumbnail.Assign(BMP128);
- FormMain.FFileList[i] := FItem;
- //Посылаем команду на перерисовку сетки
- FormMain.FFileList.Repaint;
- end
- else
- DoBreak := True;
- end);
- BMP128.Free;
- if DoBreak then
- Break;
- end;
- end;
- Stopped := True;
- end;
- end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement