Консультация № 140554
23.07.2008, 13:24
0.00 руб.
0 4 1
Хочется сделать так: На картинке (TImage) по нажатию левой кнопкой мыши вырисовывать (или создавать) еще картинку, которая будет помещаться сверху предыдущей. Один из экспертов порекомендовал на канве TImage отрисовывать объект TGraphic.
Но я не работал с этим объектом и не знаю как загрузить в него картинку. Может кто-нибудь дополнить процедуру?

Приложение:
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); begin if Button = mbLeft then begin ?????????????????? ?????????????????? Image1.Canvas.Draw(x, y, ...) end; // if end; Как проинициализировать объект TGraphic и загрузить в него изображение? Какие форматы можно загружать?

Обсуждение

Неизвестный
23.07.2008, 15:55
общий
Вам надо по клику левой кнопкой мыши по Image'у нарисовать содержимое Image'а в точке где щелкнули мышью?
Если так, то вот код:
Код:
 var
Form1: TForm1;
//Глобальная переменная в которой хранится начальное изображение
bmp:TBitmap;

implementation

{$R *.dfm}

//После запуска загружаем содержимое Image'а в Bitmap. Данный код должен выполняться после каждой загрузки нового изображения в Image
procedure TForm1.FormCreate(Sender: TObject);
begin
//Инициализируем Bitmap
bmp:=TBitmap.Create;
//Присваиваем Bitmap'у изображение из Image'а
bmp.Assign(Image1.Picture.Bitmap);
end;

//Выполняется при закрытии программы
procedure TForm1.FormDestroy(Sender: TObject);
begin
//Освобождаем память
bmp.Free;
end;

//Здесь рисуем
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
//Копируем исходный рисунок в место куда щелкнули мышью
Image1.Canvas.BrushCopy(Rect(x, y, x+image1.Width, y+image1.Height), bmp, Rect(0, 0, Image1.Width, Image1.Height), 0);
end;


P.S. Данный код бутет работать только с *.bmp-файлами.
Неизвестный
24.07.2008, 12:45
общий
Вообще-то нужно на имеющемся Image по клику левой кнопкой мыши нарисовать другой Image. Т. е. как бы поверх первого. Наример, есть загруженная в Image картинка - дерево, а я хочу, чтобы щелкая левой кнопкой мыши в нужном месте (например, на ветках), появлялись другие картинки - птички. Вот что нужно.
Неизвестный
24.07.2008, 16:55
общий
Тогда добавьте на форму ещё один Image, загрузите в него другой рисунок и измените код:
Код:
 //После запуска загружаем содержимое второго Image'а в Bitmap.
procedure TForm1.FormCreate(Sender: TObject);
begin
//Инициализируем Bitmap
bmp:=TBitmap.Create;
//Присваиваем Bitmap'у изображение из Image'а
bmp.Assign(Image2.Picture.Bitmap);
end;

//Выполняется при закрытии программы
procedure TForm1.FormDestroy(Sender: TObject);
begin
//Освобождаем память
bmp.Free;
end;

//Здесь рисуем
procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
if Button = mbLeft then
//Копируем исходный рисунок в место куда щелкнули мышью
Image1.Canvas.BrushCopy(Rect(x, y, x+bmp.Width, y+bmp.Height), bmp, Rect(0, 0, bmp.Width, bmp.Height), 0);
end;


P.S. Если всё подходит , то сообщите мне - отправлю полный ответ
Неизвестный
24.07.2008, 23:21
общий
это ответ
Здравствуйте, Марков Александр Сергеевич!
Положите на форму еще один TImage. Загрузите в него второй рисунок.
В обработчике события первого Image'а OnMouseDown вставьте этот код:
Код:

//Здесь рисуем
if Button = mbLeft then
//Копируем второй рисунок в место куда щелкнули мышью и центр картинки которая появляется, будет как раз в том месте, где щелкнули. Объяснение применения процедуры смотрите ниже.
Image1.Canvas.BrushCopy(Rect(x-(Image2.Width div 2), y-(Image2.Height div 2), x+(Image2.Width div 2), y+(Image2.Height div 2)), Image2.Picture.Bitmap, Rect(0, 0, Image2.Width, Image2.Height), 0);

procedure TImage.Canvas.BrushCopy(const Dest: TRect; Bitmap: TBitmap; const Source: TRect; Color: Tcolor);
Dest -область приёмника(координаты области куда копировать). Dest объявлена как структура TRect.
Чтобы из координат получить структуру TRect используем следующую конструкцию: Rect(X1, Y1, X2, Y2). X1, Y1, X2, Y2-координаты левого верхнего и правого нижнего угла области. В нашем случае указано что мы копируем в область с координатами: x-половина ширины, y-половина высоты, x+половина ширины, y+половина высоты второй картинки, где x, y-координаты места куда щелкнули мышью.
Bitmap -картинка которая будет копироватся. У нас это вторая картинка.
Source -область источника(откуда будем копировать).
Color -прозрачный цвет, у нас его нет, поэтому указано 0.
Удачи!!!

Форма ответа