Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.02.26;
Скачать: CL | DM;

Вниз

Рисование растра в метафайл   Найти похожие ветки 

 
pasha_golub ©   (2006-01-24 18:30) [0]

Здравствуйте.

Есть код:

procedure DrawC(ACanvas: TCanvas; Ax,Ay,Aw,Ah: integer; AGraphic: TGraphic);
var Emf1: TMetafile;
   Emf1_Canvas: TMetaFileCanvas;
   a: integer;
begin
If ACanvas is TMetafileCanvas then
 begin
  Emf1 := TMetaFile.Create;
  Emf1.Enhanced := True;
  Emf1.Width := Aw;
  Emf1.Height := Ah;
  try
   Emf1_Canvas := TMetafileCanvas.Create(Emf1,0);
   try
    Emf1_Canvas.Draw(0,0,AGraphic);
    Emf1_Canvas.MoveTo(0, 0);
    for a:=0 to 10 do
     Emf1_Canvas.LineTo(Random(Aw),Random(Ah));
   finally
    Emf1_Canvas.Free;
   end;
   ACanvas.Draw(Ax,Ay,Emf1);
  finally
   Emf1.Free;
  end;
 end;
end;

procedure TForm1.Button2Click(Sender: TObject);
Var EMF: TMetafile;
   EMF_Canvas: TmetafileCanvas;
   x, y: integer;
   W, H: integer;
   i,j,a: integer;
begin
{$DEFINE PASHA}
x := StrToInt(Edit1.Text);
y := StrToInt(Edit2.Text);
W := image1.Width;
H := image1.Height;
EMF := TMetafile.Create;
try
 EMF.Enhanced := True;
 EMF.Width := W*x; //размер всего
 EMF.Height := H*y; // метафайла
 EMF_Canvas := TmetafileCanvas.Create(EMF,0);
 try
  for i:=0 to x-1 do
   for j:=0 to y-1 do
   {$IFDEF PASHA}
    with EMF_Canvas do
     begin
       Draw(W*i,H*j,Image1.Picture.Graphic);
       MoveTo(W*i,H*j);
       for a:=0 to 10 do
         LineTo(W*i+Random(W),H*j+Random(H));
     end;
    {$ELSE}
      DrawC(EMF_Canvas,W*i,H*j,W,H,Image1.Picture.Graphic);
    {$ENDIF}

 finally
  EMF_Canvas.Free;
 end;
 EMF.SaveToFile("e:\debug.emf");
finally
 EMF.Free;
end;
ShowMessage("Done");
end;


Функционально делает одно и тоже. Рисует в метафайл сетку из битмапов из Image1 размером   x на y .

В каждой ячейке сверху битмапа случайный узор из линий на всякий случай.

Если поставить, например, х = 200, а у = 1. Для того чтобы метафайл (изображение) не помещался на экране.

То код из {$IFDEF PASHA} отрабатывает как задумано. Есть грид 200х1 с ячейками-битмапами и сверху чуток линий.

А код из {$ELSE} отрисовывает только "по размерам" экрана, а все остальное заполнено только линиями (векторы), а битмапов не видно.

Почему так? Извините, если сумбурно, очень устал.

Если вообще не понятно, смогу привести примеры файлов результатных.


 
pasha_golub ©   (2006-01-24 18:33) [1]

Добавлю. По идее.

Код из  {$IFDEF PASHA} рисует сразу на конечную канву, а код из {$ELSE} создает дополнительно временный метафайл (внутри DrawC), его прорисовывает, и потом выводит временный метафайл на конечную канву.


 
pasha_golub ©   (2006-01-25 11:12) [2]

Думал, что может зависеть от битмапа (палитра, размер и т.д.), перепробовал все что было под рукой. В пределах экрана рисует, за пределами - нет.

ЗЫ Если у кого-то десктоп мультимониторный, проверьте, пожалуйста. Интересно дюже.


 
MBo ©   (2006-01-25 12:55) [3]

воспроизвел - действительно, не рисует дальше определенной позиции - но у меня это не размер экрана (800), а больше - около 1000. С чем связано - непонятно :(


 
pasha_golub ©   (2006-01-25 20:04) [4]

Спасибо, Борис. Хотя бы за внимание. :0)



Страницы: 1 вся ветка

Текущий архив: 2006.02.26;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.035 c
3-1136285879
Стелс
2006-01-03 13:57
2006.02.26
Обращение к полям


1-1138270310
Nait
2006-01-26 13:11
2006.02.26
Как сделать процедуру OnButtonClick на клонированную кнопку


1-1138117553
medvedenator
2006-01-24 18:45
2006.02.26
TaskBar


15-1139101833
Ezorcist
2006-02-05 04:10
2006.02.26
Питание кулерам!


11-1120149976
Thaddy
2005-06-30 20:46
2006.02.26
Strange registry bug