• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

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

Guest

Такая трабла… На форме 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;

Однако выходит следующий баг, связанный со смещением сетки:

link removed

Что делать?
 
B

Barmutik

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

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

Guest

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

Barmutik

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

Guest

Потратил дополнительно около часа, чтобы изобрести… возможно и велосипед – новый код :) Суть заключается в снятии скриншота всей экранной области, начальные координаты 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;
 
G

Guest

Для: Barmutik, смотри, для чего применил код:
 
B

Barmutik

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

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

Guest

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!