|
#1
|
||||
|
||||
TBitmap и TThread
Итак:
Подскажите пожалуйста, если кто знает, как правильно использовать 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... Помогите пожалуйста разобраться. THE CRACKER IS OUT THERE |