Тема: TBitmap и TThread
Показать сообщение отдельно
  #1  
Старый 18.09.2006, 14:11
Аватар для 4kusNick
4kusNick 4kusNick вне форума
Местный
 
Регистрация: 06.09.2006
Адрес: Россия, Санкт-Петербург
Сообщения: 444
Репутация: 550
Печаль 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
Ответить с цитированием