Итак:
Подскажите пожалуйста, если кто знает, как правильно использовать TThread для того, чтобы вынести функцию наложения фльтра в отдельный поток.
Вот код фильтра Sepia:
Код:
function BmpToSepia(const Bmp: TBitmap; Depth: Integer): Boolean;
var
Color,Color2: LongInt;
r,g,b,rr,gg: Byte;
h,w: Integer;
begin
for h := 0 to Bmp.Height do
begin
Filters.ProgressBar.StepIt;
Filters.ProgressBar.Update;
for w := 0 to Bmp.Width do
begin
//сначала конвертируем bmp в черно-белые цвета
Color := ColorToRGB(Bmp.Canvas.Pixels[w,h]);
r := GetRValue(Color);
g := GetGValue(Color);
b := GetBValue(Color);
Color2 := (r + g + b) div 3;
Bmp.Canvas.Pixels[w,h] := RGB(Color2,Color2,Color2);
//затем ковертируем в Сепию
Color := ColorToRGB(Bmp.Canvas.Pixels[w,h]);
r := GetRValue(Color);
g := GetGValue(Color);
b := GetBValue(Color);
rr := r + (Depth*2);
gg := g + Depth;
if rr <= ((Depth*2)-1) then
rr := 255;
if gg <= (Depth-1) then
gg := 255;
Bmp.Canvas.Pixels[w,h] := RGB(rr,gg,b);
end;
end;
Result := True;
end;
Depth = 20;
Создал потомка от TThread:
Код:
unit SepiaThread;
interface
uses
Classes, SysUtils, Windows, Graphics;
type
TSepiaThread = class(TThread)
private
EBmp: Graphics.TBitmap
{ Private declarations }
protected
procedure UpdatePrb;
procedure Execute; override;
function BmpToSepia(const Bmp: TBitmap; Depth: Integer): Boolean;
public
constructor Create(bmpBitmap: Graphics.TBitmap);
end;
implementation
uses MainForm;
constructor TSepiaThread.Create(bmpBitmap: Graphics.TBitmap);
begin
// как правильно:
//EBmp := bmpBitmap;
// или
//EBmp := Graphics.TBitmap.Create();
//EBmp.Assign(bmpBitmap) ?
EBmp := bmpBitmap;
inherited Create(False);
end;
procedure TFirstThread.UpdatePrb;
begin
Main.ProgressBar.StepIt;
end;
function TFirstThread.BmpToSepia(const Bmp: TBitmap; Depth: Integer): Boolean;
var
Color,Color2: LongInt;
r,g,b,rr,gg: Byte;
h,w: Integer;
begin
for h := 0 to Bmp.Height do
begin
Filters.ProgressBar.StepIt;
Filters.ProgressBar.Update;
for w := 0 to Bmp.Width do
begin
//сначала конвертируем bmp в черно-белые цвета
Color := ColorToRGB(Bmp.Canvas.Pixels[w,h]);
r := GetRValue(Color);
g := GetGValue(Color);
b := GetBValue(Color);
Color2 := (r + g + b) div 3;
Bmp.Canvas.Pixels[w,h] := RGB(Color2,Color2,Color2);
//затем ковертируем в Сепию
Color := ColorToRGB(Bmp.Canvas.Pixels[w,h]);
r := GetRValue(Color);
g := GetGValue(Color);
b := GetBValue(Color);
rr := r + (Depth*2);
gg := g + Depth;
if rr <= ((Depth*2)-1) then
rr := 255;
if gg <= (Depth-1) then
gg := 255;
Bmp.Canvas.Pixels[w,h] := RGB(rr,gg,b);
end;
end;
Result := True;
end;
procedure TFirstThread.Execute;
var
c: Integer;
begin
FreeOnTerminate := True;
BmpToSepia(EBmp,20);
end;
end.
Код писал по памяти, по-этому, могут быть опечатки - не ругайте.
Так вот, в результате таких действий:
Код:
Unit MainForm;
...
...
uses SepiaThread
procedure...
...
var Thread: TSepiaThread;
begin
Thread := TSepiaThread.Create(Image1.Picture.Bitmap);
end;
Картинка исчезает вовсе.
Мне кажется, что все дело в том, что я либо не присваиваю Image1.Picture.Bitmap'у правильное значение либо как-то не так присваиваю внутренней переменной типа TBitmap потока входящую TBitmap...
Помогите пожалуйста разобраться.