Копирование Image в Image

  • Автор темы Guest
  • Дата начала
G

Guest

#1
Такая трабла… На форме 2 компонента Image. Первый имеет свойство Stretch=True, второй – Stretch=False. Необходимо скопировать содержимое первого Image во второй 1:1. Копирую следующим образом:

Код:
var
SRect, DRect : TRect;
begin
SRect:=Rect(Image1.Left,Image1.Top,Image1.Width,Image1.Height);
DRect:=Rect(0,0,Image2.Width,Image2.Height);
Image2.Canvas.CopyRect(DRect, Form1.Canvas, SRect);
end;
Однако выходит следующий баг, связанный со смещением сетки:



Что делать?
 
B

Barmutik

#2
Можно попробовать так:

Код:
 Image2.Canvas.StretchDraw(Rect(0, 0, Image1.Width, Image1.Height),
 Image1.Picture.Graphic);
 
G

Guest

#3
Barmutik, код копирует замечательно. Спасибо! Дело в том, что сетка создана на основе прозрачных компонентов Shape, находящихся на компоненте Image1. Мне бы хотелось сделать снапшот участка формы, ограниченного размерами Image1 и результат загрузить в Image2. На самом деле я пишу нечто вроде графического анализатора и наличие сетки на изображении крайне необходимо для алгоритма анализа.
 
B

Barmutik

#4
Ясно ... ну я думаю, что Вы смогли сами модифицировать код предложенный мною под реализацию Вашей задачи.
 
G

Guest

#5
Потратил дополнительно около часа, чтобы изобрести… возможно и велосипед – новый код :) Суть заключается в снятии скриншота всей экранной области, начальные координаты X,Y которой соответствуют экранным координатам компонента Image1, при помощи функции bitblt. Результат записывается в динамически созданный Bitmap, который в последующем загружается в Image2.

Код:
var
bmp: TBitmap;
DC: HDC;
SrcImgPoint : TPoint;
begin
bmp:=TBitmap.Create;
bmp.Height:=Image1.Height;
bmp.Width:=Image1.Width;
DC:=GetDC(0);
SrcImgPoint:=Image1.ClientToScreen(Point(Image1.Left,Image1.Top));
bitblt(bmp.Canvas.Handle,
    0, 0,
    Image1.Width, Image1.Height,
    DC,
    SrcImgPoint.X-Image1.Left, SrcImgPoint.Y-Image1.Top,
    SRCCOPY);
Image2.Picture.Bitmap:=bmp;
ReleaseDC(0, DC);
end;
 
B

Barmutik

#8
Аккуратно сделано ...

Только может если делаете прозрачность окна может делать его части .. только ту что совместить надо ... а не всего окна ...
 
G

Guest

#9
Для: Barmutik:
Спасибо! Кстати, идея о создании прозрачности региона была, но в графике я не очень силен. Поэтому пришлось ограничиться тем, что стандартно предлагает Delphi 6.0 по управлению прозрачностью.