Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Звук, графика и видео > Графический редактор


Автор: okamor71 15.10.2006, 08:42
Доброго дня всем, народ помогите, нужно срочно накатать програмульку в виде граф. редактора по аналогии с фотошоп, пракчиски все сделал кроме одного: как реализовать слойность, и при необходимости двигать выбраным слоем. 

Автор: Alexeis 15.10.2006, 11:50
Цитата(okamor71 @  15.10.2006,  08:42 Найти цитируемый пост)
при необходимости двигать выбраным

Проще всего я думаю размесить, каждый слой в своем TImage и перемещать целиком компонент, тем более у него есть события, onMouseDown, onMouseUp, onMouseMove.

Автор: okamor71 15.10.2006, 20:39
alexeis1, а как их потом объеденить в одну картинку????????

Автор: Alexeis 15.10.2006, 22:16
Скопировать изображение из одной канвы в другую. Есть функция CopyRect для этого.

Автор: CrazyIvan 16.10.2006, 13:04
Имхо лучше создать в памяти коллекцию битмапов, а потом рисовать их в необходимой последовательности. Т.к. целый TImage это дорого в плане памяти.
Да и могут быть проблемы с наложением огромного количества TImage друг на друга. Лучше это возложить на собственный "движок".

Автор: Alexeis 16.10.2006, 14:28
Цитата(CrazyIvan @  16.10.2006,  13:04 Найти цитируемый пост)
Лучше это возложить на собственный "движок". 

Собственный движок всегда лучше, но сложнее.

Автор: okamor71 17.10.2006, 11:34
alexeis1, не подскажите еще как мне реализовать перемещение TImage, по нажатию кнопки мыши и прекритить когд кнопку отпустил, если мона то помогите сурсом, а то с графикой практичеки не работал на дельфи

Автор: Alexeis 17.10.2006, 12:12
okamor71, тут графика не при чем
Нужно присвоить компоненту TImage обработчики 
MouseDown
MouseMove
MouseUp
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ExtCtrls;

type
  TForm1 = class(TForm)
    Image: TImage;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    procedure ImageMouseDown(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
      Y: Integer);
    procedure ImageMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  fl : boolean = false;
  X0, Y0 : Integer;

procedure TForm1.ImageMouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  fl := true;
  X0 := X;
  Y0 := Y;
end;

procedure TForm1.ImageMouseMove(Sender: TObject; Shift: TShiftState; X,
  Y: Integer);
begin
  if fl
  then
    Begin
     (Sender as TImage).Left := X - X0 + (Sender as TImage).Left;
     (Sender as TImage).Top  := Y - Y0 + (Sender as TImage).Top;
    end;
end;

procedure TForm1.ImageMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  fl := false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  image.Canvas.LineTo(100,100);
  form1.DoubleBuffered := true;
  image.OnMouseDown := ImageMouseDown;
  image.OnMouseMove := ImageMouseMove;
  image.OnMouseUp   := ImageMouseUp;
end;

end.


Эти обработчики можно присваивать любому TImage они универсальные

Автор: okamor71 17.10.2006, 14:02
alexeis1, Проститечто надоедаю, но немогу понять в что тут не так
Код

  Image1.Canvas.DrawFocusRect(R1);
  Image2.Canvas.DrawFocusRect(R2);
  BM:=BitMap.Create;
  BM.Width:=R2.Right - R2.Left;
  BM.Height:=R2.Bottom - R2.Top;
  try
    BM.Canvas.Copyrect(R1, BM.Canvas, R2);
  finally
    BM.Free
  end;
  if SavePictureDialog1.Execute then begin
    BitMap.Assign(Image1.Picture);
    BitMap.SaveToFile(SavePictureDialog1.FileName);
  end;

или может Вы подскажите как наложить Image2 на Image1

Автор: Alexeis 17.10.2006, 15:19
Цитата(okamor71 @  17.10.2006,  14:02 Найти цитируемый пост)
BM.Canvas.Copyrect(R1, BM.Canvas, R2);

Странный способ копирования... Производится попытка скопировать изображения с самого себя, на себя. На сколько я помню эта функция не умеет такого делать (только с разных холстов), да и бессмыслено, ведь нужно копировать изображение с другого объекта.

Автор: okamor71 17.10.2006, 19:52
Вопрос снимается, проблему решил, тему можно в принцыпе закрывать

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)