Я создаю некоторые .wmf файлы, но некоторые из них кажутся поврежденными и не могут быть показаны в любом метафайле. После некоторых проб и ошибок я обнаружил, что проблема связана с их размерами. Если я уменьшу масштаб одного и того же чертежа, чтобы уменьшить размеры, это будет показано.
Теперь, я хочу знать, есть ли ограничение размера чертежа, или если проблема - это что-то другое. Я знаю, что эти файлы имеют 16-битную структуру данных, поэтому я предполагаю, что ограничение будет составлять 2 ^ 16 единиц в каждом измерении ( или 2 ^ 15, если он подписан). Но в моих тестах это около 25 000. Поэтому я не могу полагаться на это значение, поскольку ограничение может быть на что угодно (может быть, ширина или высота, возможно, может повлиять на разрешение чертежа). Я не могу найти надежный ресурс о файлах .wmf, которые описывают это.
Вот пример кода, который показывает проблему:
procedure DrawWMF(const Rect: TRect; const Scale: Double; FileName: string);
var
Metafile: TMetafile;
Canvas: TMetafileCanvas;
W, H: Integer;
begin
W := Round(Rect.Width * Scale);
H := Round(Rect.Height * Scale);
Metafile := TMetafile.Create;
Metafile.SetSize(W, H);
Canvas := TMetafileCanvas.Create(Metafile, 0);
Canvas.LineTo(W, H);
Canvas.Free;
Metafile.SaveToFile(FileName);
Metafile.Free;
end;
procedure TForm1.Button1Click(Sender: TObject);
const
Dim = 40000;
begin
DrawWMF(Rect(0, 0, Dim, Dim), 1.0, 'Original.wmf');
DrawWMF(Rect(0, 0, Dim, Dim), 0.5, 'Scaled.wmf');
try
Image1.Picture.LoadFromFile('Original.wmf');
except
Image1.Picture.Assign(nil);
end;
try
Image2.Picture.LoadFromFile('Scaled.wmf');
except
Image2.Picture.Assign(nil);
end;
end;
PS: Я знаю, что настройка Metafile.Enhanced
на True
и сохранение его как файла .emf решит проблему, но целевое приложение, для которого я создаю файлы, не поддержка улучшенных метафайлов.
Edit: Как упоминалось в ответах ниже, здесь есть две разные проблемы:
Основная проблема заключается в самом файле, он имеет ограничение 2 ^ 15 для каждого измерения. Если ширина или высота чертежа превышают это значение, delphi напишет поврежденный файл. Вы можете найти более подробную информацию в Sertac answer.
Вторая проблема заключается в загрузке файла в TImage
. Еще одно ограничение, когда вы хотите показать изображение в приложении Delphi VCL. Эта система зависит от системы и связана с разрешением dpi, что чертеж будет окрашен. Tom answer подробно описывает это. Передача 0,7 от Scale
до DrawWMF
(пример кода выше) воспроизводит эту ситуацию на моем ПК. Сгенерированный файл в порядке и может быть просмотрен с другими программами просмотра метафайлов (я использую диспетчер изображений MS Office), но VCL не может его показать, однако при загрузке файла не возникает никаких исключений.