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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сохранить рисунок с Canvas'а TForm в файл, желательно в формате Metafile 
:(
    Опции темы
Delphist
  Дата 22.12.2005, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



На форме находятся технические компоненты. Мне необходимо сохранить весь рисунок Canvas'a этой формы в файл (желательно в формате wmf), который занимает следующие параметры: крайний верхний левый угол это крайний верхний левый компонент, крайний нижний правый угол это крайний нижний правый компонент. Причем если размеры формы отсекают рисунок, то рисунок все равно должен быть сохранен по размерам которые указаны выше.
См. рисунок



Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  pic.rar 48,57 Kb


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
DemoCode
Дата 22.12.2005, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот когда-то давно на этом же форуме нашел:

Код

function CaptureScreenRect(ARect : TRect) : TBitmap;
var
 ScreenDC : HDC;
begin
 Result:=TBitmap.Create;
 with result, ARect do begin
  Width:=Right-Left;
  Height:=Bottom-Top;
  ScreenDC:=GetDC(0);
  try
    BitBlt(Canvas.Handle, 0,0,Width,Height,ScreenDC, Left, Top, SRCCOPY    );
  finally
    ReleaseDC(0, ScreenDC);
  end;
  Palette:=GetSystemPalette;
 end;
end;


В ARect передаёшь прямоугольник который надо сохранить, а дальше сохранить в wmf - дело техники.


--------------------
Жить стало лучше, жить стало веселей
© И.В. Сталин 
PM MAIL ICQ   Вверх
s-mike
Дата 22.12.2005, 20:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

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



CopyRect. Сохранить в WMF можно только если рисовалось на TMetafileCanvas. Я же не думаю, что тебе в векторном файле нужен растр ;)
PM MAIL WWW   Вверх
Delphist
  Дата 28.12.2005, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



DemoCode код который ты превел выполняет совсем другие действия. Он умеет сохранять любой кусок картинки из общей картинки экрана. А мне нужно сохранять всю картинку canvas'a формы даже если форма перекрывает её (см. рисунок).

Это сообщение отредактировал(а) Delphist - 28.12.2005, 17:11


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
s-mike
Дата 29.12.2005, 08:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 425
Регистрация: 16.1.2005
Где: Киев

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



Цитата(Delphist @ 28.12.2005, 15:19)
А мне нужно сохранять всю картинку canvas'a формы даже если форма перекрывает её (см. рисунок).

А мой пост прошел незамеченным? Но лучше как я уже говорил - не сохранять, а именно отрисовывать на TMetafileCanvas, если нужно сохранить в метафайл.
PM MAIL WWW   Вверх
Delphist
  Дата 29.12.2005, 13:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата(s @ 29.12.2005, 08:18)
Цитата(Delphist @ 28.12.2005, )
А мне нужно сохранять всю картинку canvas'a формы даже если форма перекрывает её (см. рисунок).

А мой пост прошел незамеченным? Но лучше как я уже говорил - не сохранять, а именно отрисовывать на TMetafileCanvas, если нужно сохранить в метафайл.

Контролы размещаются на форме и внешний вид содержимого на форме даже если контрол
заходит за рамки формы) необходимо сохранить в файл. Все о чём ты пишешь не о чем понятно. Не мог бы набрасать примерчик?

М
 
Поиск...


Это сообщение отредактировал(а) Girder - 29.12.2005, 14:11


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
DemoCode
Дата 29.12.2005, 15:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Вот набрасал примерчик.
Программа ищет на форме все TImage и при нажатии на кнопку сохраняет всё в битмап, согласно размещению их на форме. При этом TImage могут выходить за правую и нижнюю границы формы.
Если что-то не понятно, прицепляю исходник проекта (Delphi 6).
Код

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Image1: TImage;
    Image2: TImage;
    BitBtn1: TBitBtn;
    procedure BitBtn1Click(Sender: TObject);
  private
    { Private declarations }
    MaxX, MaxY, MinX, MinY: Integer;
    Bmp: TBitmap;
    procedure SetCanvasParams;
    procedure CreateBitmap;
    procedure DrawBitmapCanvas;
    procedure Save;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   SetCanvasParams;
   CreateBitmap;
   DrawBitmapCanvas;
   Save;
end;

procedure TForm1.CreateBitmap;
begin
   Bmp:=TBitmap.Create;
   Bmp.Width:=MaxX-MinX;
   Bmp.Height:=MaxY-MinY;
end;

procedure TForm1.DrawBitmapCanvas;
var
   I: Integer;
   X, Y: Integer;
   BmpX, BmpY: Integer;
begin
   for I:=0 to Form1.ComponentCount-1 do
   begin
      if Form1.Components[I].ClassName = 'TImage' then
      begin
         for X:=0 to (Form1.Components[I] as TImage).Width do
         begin
            for Y:=0 to (Form1.Components[I] as TImage).Height do
            begin
               BmpX:=MinX+(Form1.Components[I] as TImage).BoundsRect.Left+X;
               BmpY:=MinY+(Form1.Components[I] as TImage).BoundsRect.Top+Y;
               Bmp.Canvas.Pixels[BmpX,BmpY]:=
                  (Form1.Components[I] as TImage).Canvas.Pixels[X,Y];
            end;
         end;
      end;
   end;
end;

procedure TForm1.Save;
begin
   Bmp.SaveToFile('test.bmp');
end;

procedure TForm1.SetCanvasParams;
var
   I: Integer;
begin
   MinX:=SizeOf(Integer);
   MinY:=SizeOf(Integer);
   MaxX:=-SizeOf(Integer);
   MaxY:=-SizeOf(Integer);
   for I:=0 to Form1.ComponentCount-1 do
   begin
      if Form1.Components[I].ClassName = 'TImage' then
      begin
         if (Form1.Components[I] as TImage).BoundsRect.Left < MinX then
            MinX:=(Form1.Components[I] as TImage).BoundsRect.Left;
         if (Form1.Components[I] as TImage).BoundsRect.Right > MaxX then
            MaxX:=(Form1.Components[I] as TImage).BoundsRect.Right;
         if (Form1.Components[I] as TImage).BoundsRect.Top < MinY then
            MinY:=(Form1.Components[I] as TImage).BoundsRect.Top;
         if (Form1.Components[I] as TImage).BoundsRect.Bottom > MaxY then
            MaxY:=(Form1.Components[I] as TImage).BoundsRect.Bottom;
      end;
   end;
end;

end.


Это сообщение отредактировал(а) DemoCode - 29.12.2005, 15:34

Присоединённый файл ( Кол-во скачиваний: 12 )
Присоединённый файл  canvas.zip 110,48 Kb


--------------------
Жить стало лучше, жить стало веселей
© И.В. Сталин 
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

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

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

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

FAQ раздела лежит здесь!


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

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


 




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


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

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