объясните мне как такое возможно
при преобразовании изображения через сгенерированный TBitman, процесс преобразования чуть более минуты
если добавить в процедуру преобразования ( application.processmessages; ) , то процесс тратит около 25 секунд
а вот при любой попытке визуализировать данный процесс, хоть через тот же TProgressBar , время обработки увеличивается до 9-ти минут..
процедура преобразования::
procedure SettingPazzle_bLoadImages_OnClick (Sender: TObject; var Cancel: boolean);
var
OpenDialog: TOpenDialog;
i,c: integer;
procedure convert;
var
i,j,r,g,b: integer;
c,d: TColor;
prog:TProgressBar;
buf:TBitmap;
begin
SettingPazzle.dbiColor.Picture.Bitmap.Canvas.StretchDraw(0,0,1100,640,SettingPazzle.dbiLoad.Picture.Graphic);
SettingPazzle.dbiColor.Width:=SettingPazzle.dbiColor.Picture.Width;
SettingPazzle.dbiColor.Height:=SettingPazzle.dbiColor.Picture.Height;
buf:=TBitmap.Create;
buf.Width:=SettingPazzle.dbiColor.Picture.Width;
buf.Height:=SettingPazzle.dbiColor.Picture.Height;
prog:=TProgressBar.Create(SettingPazzle);
prog.Parent:=SettingPazzle.pProgress;
prog.Left:=0;
prog.Top:=0;
prog.Width:= SettingPazzle.pProgress.Width;
prog.Height:= SettingPazzle.pProgress.Height;
prog.Visible:=True;
prog.Max:=SettingPazzle.dbiColor.Width*SettingPazzle.dbiColor.Height;
prog.Min:=0;
SettingPazzle.pProgress.Visible:=True;
for i :=0 to SettingPazzle.dbiColor.Width-1 do
for j :=0 to SettingPazzle.dbiColor.Height-1 do
begin
application.processmessages;
prog.Position:=prog.Position+1;
c :=SettingPazzle.dbiColor.Picture.Bitmap.Canvas.Pixels[i,j];
d:=round((0.30*GetRValue(c))+(0.59*GetGValue(c))+(0.11*GetBValue(c)));
buf.Canvas.Pixels[i,j] :=RGB(d,d,d);
end;
SettingPazzle.dbiLoadBW.Picture.Bitmap.Canvas.Draw(0,0,buf);
SettingPazzle.dbiColor.Picture.Graphic.SaveToFile('C:\Users\user\Desktop\Новая папка\'+IntToStr(nn)+'(c).jpg');
SettingPazzle.dbiLoadBW.Picture.Graphic.SaveToFile('C:\Users\user\Desktop\Новая папка\'+IntToStr(nn)+'(b).jpg');
end;
function GetRValue(rgb: TColor): Byte;
begin
Result:=rgb and $000000ff;
end;
function GetGValue(rgb: TColor): Byte;
begin
Result:=(rgb shr 8) and $000000ff;
end;
function GetBValue(rgb: TColor): Byte;
begin
Result:=(rgb shr 16) and $000000ff;
end;
begin
OpenDialog := TOpenDialog.Create(SettingPazzle);
OpenDialog.Options := ofHideReadOnly+ofAllowMultiSelect+ofEnableSizing;
if OpenDialog.Execute then
begin
c := OpenDialog.Files.Count-1;
for i := 0 to c do
begin
if FileExists(OpenDialog.Files[i]) then
begin
nn:=i;
SettingPazzle.eImageName.Text:=ExtractFileName(OpenDialog.Files[i]);
SettingPazzle.dbiLoad.Picture.LoadFromFile(OpenDialog.Files[i]);
SettingPazzle.dbiLoad.dbFileName := OpenDialog.Files[i];
convert;
end;
end;
end;
OpenDialog.Free;
SettingPazzle.pProgress.Visible:=False;
end;
самый быстрый вариант без (TProgressBar)