![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Создание emf+ и png файла с помощью GDI+ [D7]
Jimmy © (2013-08-28 14:03:00)Здравствуйте!
Следующий код рисует черный квадрат на PaintBox1.
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
R : TGPRect;
Pen : TGPPen;
Graph : TGPGraphics;
begin
Graph := TGPGraphics.Create(PaintBox1.Canvas.Handle);
Pen:= TGPPen.Create(MakeColor(255, 0, 0, 0), 1);
R.X := 0; R.Y := 0;
R.Width := 50; R.Height := 50;
Graph.DrawRectangle(Pen,R);
Pen.Free;
Graph.Free;
end;
Как мне сохранить этот рисунок в png и emf+ формате? Заранее спасибо!
icWasya (2013-08-29 10:28:00) [1]>>не связуя его с файлом?
Кажется, если в качестве имени метафайла указать nil, то метафайл будет создан в памяти.
Jimmy (2013-08-28 19:57:00) [2]Не нужен один универсальный алгоритм для растровой и векторной графики. Нужно два разных. Ну вот я что-то набросал, но вопросы остались. Сами вопросы - внутри кода. Извините за сумбурность.
procedure TForm1.PaintBox1Paint(Sender: TObject);
var
Holst1:TBitmap;
Meta :TGPMetafile;
R : TGPRect;
Pen : TGPPen;
Graph : TGPGraphics;
Graph1: TGPGraphics;
Image :TGPImage;
Stat:Status;
Clsid: TGUID;
N:Byte;
//Bitmap:TGPBitmap;
begin
N:=1;
//Растровая графика
if N=1 then
begin
Holst1:= TBitmap.Create;
Holst1.Width :=200;
Holst1.Height:=200;
Graph := TGPGraphics.Create(Holst1.Canvas.Handle);
{Вопрос 1. Правильно я делаю, что указываю Holst1, а не скажем PaintBox1.Canvas.Handle? Ведь может быть необходимость вывести рисунок с другим масштабом на экран}
Pen:= TGPPen.Create(MakeColor(255, 0, 0, 0), 1);
R.X := 0; R.Y := 0;
R.Width := 50; R.Height := 50;
Graph.DrawRectangle(Pen,R);
PaintBox1.Canvas.Draw(0,0,Holst1);
Holst1.SaveToFile('111.bmp');
{Вопрос 2. Можно ли как-то "отправить" Graph в Image без промежуточного '111.bmp'? Будет ли при этом png 32-битным?}
Image := TGPImage.Create('111.bmp');
GetEncoderClsid('image/png', Clsid);
Stat := Image.Save('111.png', Clsid, nil);
Image.Free;
Pen.Free;
Graph.Free;
Holst1.Free;
end;
//Векторная графика
if N=2 then
begin
{Вопрос 3. А как создать Meta, не связуя его с файлом? А сохранять потом лишь при необходимости.}
Meta := TGPMetaFile.Create('111.emf', PaintBox1.Canvas.Handle,MakeRect(0,0,200,200),MetaFileFrameUnitPixel);
Graph := TGPGraphics.Create(Meta);
Pen:= TGPPen.Create(MakeColor(255, 0, 0, 0), 1);
R.X := 0; R.Y := 0;
R.Width := 50; R.Height := 50;
Graph.DrawRectangle(Pen,R);
Graph.Free;
Graph1:= TGPGraphics.Create(PaintBox1.Canvas.Handle);
Graph1.DrawImage(Meta,0,0);
Graph1.Free;
Pen.Free;
Meta.Free;
end;
end;
Jeer (2013-08-28 18:30:00) [3]На экране не бывает векторных рисунков.
умный-преумный (2013-08-28 17:51:00) [4]
> растровая или векторная графика, наверное, не важно для
> процесса рисования,
зато важно, чтобы
> на экране и в файле получить а) растровый рисунок; б) векторный.
я вот представляю довольно-таки простой способ растрирования, а вот перевести растр в вектор - сам бы не взялся.
Так что, на мой взгляд, если нужно и то, и другое, базовым должен быть вектор.
Jimmy (2013-08-28 16:58:00) [5]Я, наверное, не лучшим образом сформулировал вопрос, но только начал разбираться с GDI+, не судите строго. В общем, допустим, я умею рисовать на Graph : TGPGraphics. Что это - растровая или векторная графика, наверное, не важно для процесса рисования, также как одинаково рисовать на Canvas и MetaFileCanvas. Вопрос в том, как создать этот Graph и что с ним сделать после прорисовки, чтобы и на экране и в файле получить а) растровый рисунок; б) векторный.
умный-преумный (2013-08-28 16:53:00) [6]http://forum.sources.ru/index.php?showtopic=112695
stas (2013-08-28 16:28:00) [7]...с помощью GDI+
Сорри не увидел.
stas (2013-08-28 16:27:00) [8]https://www.google.com.ua/search?q=tpngimage+delphi&oq=tpngimage+delphi&aqs=chrome..69i57j0l3.10197j0&sourceid=chrome&ie=UTF-8