Sto creando alcuni file .wmf, ma alcuni di essi sembrano corrotti e non possono essere visualizzati in qualsiasi visualizzatore di metafile. Dopo alcune prove ed errori, ho scoperto che il problema è causato dalle loro dimensioni. Se ridimensiono lo stesso disegno di un fattore per ridurre le dimensioni, verrà mostrato.Esiste una limitazione per le dimensioni dei metafile di Windows?
Ora, voglio sapere se c'è una limitazione sulla dimensione del disegno o se il problema è qualcos'altro. So che questi file sono have a 16-bit data structure, quindi suppongo che la limitazione sarebbe di 2^16 unità in ogni dimensione, (o 2^15 se è firmata). Ma nei miei test sono circa 25.000. Quindi non posso contare su questo valore poiché la limitazione può essere su qualsiasi cosa (Larghezza * Altezza forse, o forse la risoluzione del disegno potrebbe influenzarlo). Non riesco a trovare una risorsa affidabile sui file .wmf che descrive questo.
Ecco il codice di esempio che mostra il problema:
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: So che l'impostazione Metafile.Enhanced
a True
e salvarlo come file EMF risolverà il problema, ma l'applicazione di destinazione che ho La generazione dei file per non supporta i Metafile avanzati.
Edit: Come accennato nel risposte qui sotto, ci sono due diversi problemi qui:
Il problema principale è di circa il file stesso, ha un limite di 2^15 su ogni dimensione. Se la larghezza o l'altezza del disegno supera questo valore, delphi scriverà un file danneggiato. Puoi trovare maggiori dettagli in Sertac's answer.
Il secondo problema riguarda il caricamento del file in un TImage
. C'è un altro limite quando vuoi mostrare l'immagine in un'applicazione delphi VCL. Questo dipende dal sistema ed è correlato al dpi di DC su cui il disegno verrà dipinto. Tom's answer descrive questo in dettaglio. Passando 0,7 come Scale
a DrawWMF
(esempio di codice sopra) riproduce questa situazione sul mio PC. Il file generato è OK e può essere visualizzato con altri visualizzatori di Metafile (utilizzo MS Office Picture Manager) ma VCL non riesce a visualizzarlo, tuttavia non viene sollevata alcuna eccezione durante il caricamento del file.
ho ri-etichettato come winapi dal momento che questo è, credo, una domanda sul formato WMF, piuttosto che tutto ciò che riguarda Delphi. –
Sei sicuro che il tuo limite è intorno ai 25000? Può essere forse, esattamente, 32767? –
Sembra plausibile che si tratti di un errore di allocazione della memoria basato sull'area totale (larghezza × altezza). –