Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с изображением, не могу разобраться с алгоритмом 
:(
    Опции темы
Barabeo
Дата 28.4.2011, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 234
Регистрация: 2.10.2010

Репутация: нет
Всего: нет



Помогите разобраться в алгоритме.
Прога выполняет увеличение  или уменьшение изображения (короче Zoom).
Вот код
Код

implementation

{$R *.dfm}
Type
  {Dйclaration d'un Type pour l'utilisation de PlgBlt}
  T2DFace = Array[0..2] Of TPoint;

Var
    BMP : TBitmap;
    VertFlip : Boolean = False;
    HorzFlip : Boolean = False;

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  BMP := TBitmap.Create;
  BMP.LoadFromFile(ExtractFilePath(Application.ExeName)+'One.bmp');
  {Evite les scintillements}
  DoubleBuffered := True;
end;

procedure TfrmMain.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  BMP.Free;
end;

{Permet de charger vos images}
procedure TfrmMain.btn_LoadBitmapClick(Sender: TObject);
begin
  If Opd.Execute Then BMP.LoadFromFile(Opd.FileName);
  Invalidate;
end;

procedure TfrmMain.tb_FactorChange(Sender: TObject);
begin
  lbl_Zoom.Caption := Format('Zoom: %d%%', [tb_Factor.Position]);
  Invalidate;
end;

procedure TfrmMain.FormResize(Sender: TObject);
begin
  Invalidate;
end;

procedure TfrmMain.pb_DisplayPaint(Sender: TObject);
{Petite astuce pour le calcule des positions}
Const OrgFlip : Array[Boolean] Of Integer = (0, 1);
      SizeFlip : Array[Boolean] Of Integer = (1, -1);
Var OrgX, OrgY,
    SizeX, SizeY : Integer;
    Factor : Extended;
    PntArray : T2DFace;
begin
  {Calcule le Facteur Zoom}
  Factor := tb_Factor.Position * 1e-2;
  With BMP do Begin
  {Calcule les positions en fonction des effets miroirs et du Zoom}
    SizeX := Round(Width * SizeFlip[HorzFlip] * Factor);
    OrgX := Round(Width * OrgFlip[HorzFlip] * Factor);
    SizeY := Round(Height * SizeFlip[VertFlip] * Factor);
    OrgY := Round(Height * OrgFlip[VertFlip] * Factor);
  End;

  If cb_Center.Checked Then Begin
  {Si l'image doit кtre centrйe}
    OrgX := OrgX + ((pb_Display.ClientWidth - Abs(SizeX)) Div 2);
    OrgY := OrgY + ((pb_Display.ClientHeight - Abs(SizeY)) Div 2);
  End;

  {Offre une meilleur qualitй lors du Zoom}
  SetStretchBltMode(pb_Display.Canvas.Handle, HALFTONE);

  If cb_UsePlgBlt.Checked Then Begin
  {En fonction du choix on dessine le rйsultat avec PlgBlt}
    PntArray[0] := Point(OrgX, OrgY);
    PntArray[1] := Point(OrgX+SizeX, OrgY);
    PntArray[2] := Point(OrgX, OrgY+SizeY);
    PlgBlt(pb_Display.Canvas.Handle, PntArray, BMP.Canvas.Handle, 0, 0, BMP.Width, BMP.Height, 0, 0, 0);
  End
  Else
  {Ou avec StretchBlt}
    StretchBlt(pb_Display.Canvas.Handle, OrgX, OrgY, SizeX, SizeY, BMP.Canvas.Handle, 0, 0, BMP.Width, BMP.Height, srcCOPY);

  lbl_PosSize.Caption := Format('Left: %d , Top: %d'#13'Width: %d , Height: %d', [OrgX, OrgY, SizeX, SizeY]);
end;


Обьясните что выполяют следующие строки.По ходу это и будет сам алгоритм изменения размеров изображения:

    SizeX := Round(Width * SizeFlip[HorzFlip] * Factor);
    OrgX := Round(Width * OrgFlip[HorzFlip] * Factor);
    SizeY := Round(Height * SizeFlip[VertFlip] * Factor);
    OrgY := Round(Height * OrgFlip[VertFlip] * Factor);

SizeX  -  выполняем преобразование по оси Х
Round - округляем полученное значение до целого чила
Width  - понятно 
SizeFlip[HorzFlip] - ?
Factor - ?
PM MAIL   Вверх
imageman
Дата 2.5.2011, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 66
Регистрация: 30.9.2004

Репутация: 1
Всего: 1



 
Цитата

Const OrgFlip : Array[Boolean] Of Integer = (0, 1);
      SizeFlip : Array[Boolean] Of Integer = (1, -1);


это описание двух массивов (каждый по 2  элемента)
OrgFlip[true] =1
OrgFlip[false] =0 {могу ошибаться}



HorzFlip - переменная типа boolean (нужно или нет переворачивать)

Factor - величина увеличения.

сами процедуры изменения размера будут PlgBlt или StretchBlt
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0437 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.