Форум: "Основная";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
ВнизКак записать метафайл в нетипизированный файл? Найти похожие ветки
← →
Navi (2004-12-13 08:34) [0]Здравствуйте!
Как записать метафайл из памяти в текущую позицию нетипизированного файла,
а затем прочитать его оттуда?
Пишу так:
var
hFile: Integer; // Handle of File
Header: THeader; // File Header that contains size of stored metafile
wmf: TMetaFile;
mfc: TMetaFileCanvas;
ms: TMemoryStream;
begin
...
ms:= TMemoryStream.Create;
try
ms.Position:= 0;
wmf:= TMetaFile.Create;
try
wmf.Width:= 100;
wmf.Height:= 100;
mfc:= TMetaFileCanvas.Create(wmf, 0);
try
mfc.Ellipse(25, 25, 75, 75);
finally
mfc.Free;
end;
wmf.SaveToStream(ms);
finally
wmf.Free;
end;
Header.MetaFileSize:= ms.Size;
FileWrite(hFile, Header, SizeOf(THeader));
FileWrite(hFile, ms, ms.Size);
finally
ms.Free;
end;
...
end;
Читаю так:
var
hFile: Integer; // Handle of File
Header: THeader; // File Header that contains size of stored metafile
Size: Integer;
Buffer: Pointer;
ms: TMemoryStream;
begin
...
ms:= TMemoryStream.Create;
try
Size:= Header.MetaFileSize;
GetMem(Buffer, Size);
try
FileRead(hFile, Buffer^, Size);
ms.Position:= 0;
ms.WriteBuffer(Buffer, Size);
Image1.Picture.Metafile.LoadFromStream(ms); <-- MetaFile is not valid!
finally
FreeMem(Buffer);
end;
finally
ms.Free;
end;
...
end;
Спасибо.
← →
Navi (2004-12-13 15:42) [1]Никто не знает?
← →
Leonid Troyanovsky © (2004-12-13 16:29) [2]
> Navi (13.12.04 15:42) [1]
> FileRead(hFile, Buffer^, Size);
> ms.Position:= 0;
> ms.WriteBuffer(Buffer, Size);
> Image1.Picture.Metafile.LoadFromStream(ms); <-- MetaFile
> is not valid!
Станешь тут инвалидом, через такие увечья.
Сохрани в FileStream, и читай соответственно.
--
С уважением, LVT.
← →
pusrg (2004-12-13 16:31) [3]Сразу предупрежу, я никогда с метафайлами не работал, но есть несколько замечаний к коду:
1. Зачем ты уничтожаешь канву, еще до сохранения файла в поток?
2. Переменная hFile: Integer; - глобальная или передается в качестве параметра? Если нет, то где CreateFile или OpenFile.
3. Cтрока
FileWrite(hFile, ms, ms.Size);
ИМХО должна выглядеть
FileWrite(hFile, ms.memory, ms.Size);
4. Не совсем понял строки:
Header.MetaFileSize:= ms.Size;
FileWrite(hFile, Header, SizeOf(THeader));
Если ты хочешь записать предварительно размер, записываемого потока, ты должен создать буфер (выделив под него память), записать в него нужное значение, и передать указатель на этот буфер в FileWrite.
← →
Navi (2004-12-18 09:18) [4]Спасибо всем. Сделал через 2 часа после того как вопрошал.
Для pusrg:
п. 1. Потому, что если help почитать то наросиванное на канве метафайла записывается в него только при уничтожении этой канвы.
пп. 2, 4. В моих отрывках кода стоят ..., там и идет и CreateFile и CloseFile и запись заголовка, в комментарии к обявлению которого я написал, что в него пишется размер метафайла.
п. 3. И ЭТО точно! После того как я выкинул промежуточный буфер все заработало.
НО странная вещь. Смотрю нормальный метафайл (созданный Image1.Picture.Metafile.SaveToFile) WinHex-ом: там первые символы ЧНЖ (формат файла не знаю, но похоже это сигнатура), а внутри файла, который содержит встроенный мной метафайл и прекрасно грузится НЕТ такой сигнатуры.
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.01.02;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.037 c