Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Графика и игры
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

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

Итак:
Подскажите пожалуйста, если кто знает, как правильно использовать TThread для того, чтобы вынести функцию наложения фльтра в отдельный поток.

Вот код фильтра Sepia:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
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:
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
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.

Код писал по памяти, по-этому, могут быть опечатки - не ругайте.

Так вот, в результате таких действий:
Код:
1
2
3
4
5
6
7
8
9
10
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
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:19.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025