Ich erstelle einige .wmf-Dateien, aber einige davon scheinen beschädigt zu sein und können in keinem Metafile-Viewer angezeigt werden. Nach etwas Versuch und Irrtum fand ich, dass das Problem von ihren Dimensionen verursacht wird. Wenn ich die gleiche Zeichnung um einen Faktor skaliere, um die Abmessungen zu reduzieren, wird dies angezeigt.Gibt es eine Beschränkung für Dimensionen von Windows Metafiles?
Nun möchte ich wissen, ob es eine Begrenzung für die Größe der Zeichnung gibt oder ob das Problem etwas anderes ist. Ich weiß, dass diese Dateien have a 16-bit data structure, so dass ich denke, dass die Beschränkung wäre 2^16 Einheiten in jeder Dimension (oder 2^15, wenn es unterzeichnet ist). Aber in meinen Tests sind es ungefähr 25.000. Ich kann mich also nicht auf diesen Wert verlassen, da die Begrenzung auf irgendetwas (Breite * Höhe vielleicht, oder vielleicht die Auflösung der Zeichnung kann es beeinflussen) kann. Ich kann keine zuverlässige Ressource über .wmf-Dateien finden, die dies beschreibt.
Hier ist Beispielcode, der das Problem zeigt:
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: Ich weiß, dass Metafile.Enhanced
zu True
Einstellung und als emf-Datei speichern, wird das Problem, aber die Zielanwendung lösen, dass ich Dateien generieren für unterstützt keine erweiterten Metadateien.
Edit: Wie unten Antworten erwähnt, gibt es zwei verschiedene Probleme hier:
Das Hauptproblem ist über die Datei selbst, hat es eine 2^15 Beschränkung auf jede Dimension. Wenn Breite oder Höhe der Zeichnung diesen Wert überschreiten, schreibt Delphi eine beschädigte Datei. Sie können weitere Details in Sertac's answer finden.
Das zweite Problem ist über das Laden der Datei in einem TImage
. Es gibt eine weitere Einschränkung, wenn Sie das Bild in einer Delphi-VCL-Anwendung anzeigen möchten. Dieser ist systemabhängig und bezieht sich auf die DC-Punkte, auf die die Zeichnung gemalt wird. Tom's answer beschreibt dies im Detail. Das Übergeben von 0.7 als Scale
an DrawWMF
(Codebeispiel oben) reproduziert diese Situation auf meinem PC. Die generierte Datei ist OK und kann mit anderen Metafile-Viewern angezeigt werden (ich verwende MS Office Picture Manager), aber VCL zeigt sie nicht an. Beim Laden der Datei wird jedoch keine Ausnahme ausgelöst.
ich als winapi erneut markiert, da dies ist, glaube ich, eine Frage über das WMF-Format anstatt alles im Zusammenhang mit Delphi. –
Sind Sie sicher, dass Ihr Limit bei 25000 liegt? Kann es vielleicht genau 32767 sein? –
Es scheint plausibel, dass es sich um ein Speicherzuordnungsfehler auf der gesamten Fläche (Breite × Höhe) basiert. –