Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 4 632

/ вопрос открыт /

Здравствуйте, эксперты!
Я прорисовываю попиксельно изображение на компоненте TImage, но мне нужно ускорить процесс! Пожалуйста помогите ускорить процесс!
Изображение может выйти за пределы компонента, но процесс продолжит подсчет. Ограничение области вычисления приводит к некорректному отображению цвета!

Т.е. если
while my<strtofloat(Edit5.Text) do и while mx<strtofloat(Edit4.Text) do
заменить на while my<py do и while mx<px do
тогда цвет не тот! Как в таком случае ускорить процесс не урезая число вычислений.


procedure TForm1.BitBtn1Click(Sender: TObject);
var
  BX, BY, mx, my, Cy, Cx, ix, iy,it, px, py : real;
  xx, yy, n,t : longint;
  col : tcolor;
begin
  Image1.Canvas.Rectangle(0,0,Image1.Width,Image1.Height);
  yy:=0;
  it:=1/strtoint(Edit3.Text);
  my:=strtofloat(Edit2.Text); //начальная точка вычислений в координатной плоскости по оси oY
  py:=my+Image1.Height*it;
  while my<strtofloat(Edit5.Text) do
  //while my<py do
    begin
      Image1.Repaint;
      my:=my+it;
      yy:=yy+1;
      xx:=0;
      mx:=strtofloat(Edit1.Text); //начальная точка вычислений в координатной плоскости по оси oX
      px:=mx+Image1.Width*it;
    //while mx<px do
    while mx<strtofloat(Edit4.Text) do
        begin
          mx:=mx+it;
          xx:=xx+1;
          Cx:=mx;
          Cy:=my;
          BY:=my;
          BX:=mx;
          ix:=0; iy:=0; n:=0;
          while (((sqr(ix)+sqr(iy))<4) and (n<64)) do
            begin
              ix:=sqr(BX)-sqr(BY)+Cx;
              iy:=2*BX*BY+Cy;
              n:=n+1;
              BX:=ix;
              By:=iy;
            end;
          Col:=Color(n);
          Form1.Image1.Canvas.Pixels[xx,yy]:=col;
        end;
    end;
end;
 
 
Function TForm1.ColorChange(var n, l ,r:longint):boolean;
begin
  if (n>l) and (n<=r) then result:=true else result:=false;
end;
 
Function TForm1.Color(var n:longint):tcolor;
var
  a : array [1..9,1..2] of longint;
  i : longint;
begin
  for I := 1 to 8 do begin a[i,1]:=7*(i-1); a[i,2]:=7*i; end;
       if ColorChange(n,a[1,1],a[1,2]) then result:=RGB(32*n,0,0)
  else if ColorChange(n,a[2,1],a[2,2]) then result:=RGB(32*n,32*n,0)
  else if ColorChange(n,a[3,1],a[3,2]) then result:=RGB(32*n,0,32*n)
  else if ColorChange(n,a[4,1],a[4,2]) then result:=RGB(0,32*n,0)
  else if ColorChange(n,a[5,1],a[5,2]) then result:=RGB(32*n,32*n,0)
  else if ColorChange(n,a[6,1],a[6,2]) then result:=RGB(0, 32*n,32*n)
  else if ColorChange(n,a[7,1],a[7,2]) then result:=RGB(0, 0, 32*n)
  else if ColorChange(n,a[8,1],a[8,2]) then result:=RGB(32*n, 0, 32*n)
  else if ColorChange(n,a[9,1],a[9,2]) then result:=RGB(0, 32*n,32*n);
end;

Приложение:
  1.  
  2.  


prorok-kane Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: prorok-kane (статус: Посетитель)
Вопрос отправлен: 3 октября 2010, 00:57
Состояние вопроса: открыт, ответов: 1.

Ответ #1. Отвечает эксперт: Вадим К

Здравствуйте, prorok-kane!
Ускорить в раз 10 (при большой картинке и больше получается) можно простым методом, просто вместо TImage использовать TBitmap, а потом с помощью копирования переносить на TImage
Image.Canvas.CopyRect(Image.ClientRect,bitmap.canvas,Image.ClientRect); // где то так:)
Если хочется ещё быстрее, то нужно использовать ScanLine
http://www.delphisources.ru/pages/faq/base/bitmap_scanline_for_pixelformat.html
Но скорее всего придется немного переделать код.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 4 октября 2010, 10:51
Оценка за ответ: 4

Комментарий к оценке: TBitmap действительно ускорил процесс вывода, но в моем случае изображение выводилось постепенно, а в этом необходимо подождать.
Так, что спасибо!

Мини-форум вопроса

Мини-форум пуст.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 1 апреля 2023, 10:32
Выполнено за 0.03 сек.
Рейтинг@Mail.ru