Форум: "Основная";
Текущий архив: 2006.02.26;
Скачать: [xml.tar.bz2];
ВнизРисование растра в метафайл Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.089 c