मैं कुछ .wmf फ़ाइलों को बना रहा हूं, लेकिन उनमें से कुछ दूषित लगते हैं और किसी भी मेटाफाइल दर्शक में नहीं दिखाए जा सकते हैं। कुछ परीक्षण और त्रुटि के बाद, मैंने पाया कि समस्या उनके आयामों के कारण होती है। यदि मैं आयाम को कम करने के लिए एक कारक द्वारा एक ही ड्राइंग को स्केल करता हूं, तो यह दिखाया जाएगा।क्या विंडोज मेटाफाइल के आयामों पर कोई सीमा है?
अब, मैं जानना चाहता हूं कि ड्राइंग के आकार पर कोई सीमा है या यदि समस्या कुछ और है। मुझे पता है कि ये फ़ाइलें have a 16-bit data structure है, इसलिए मुझे लगता है कि सीमा प्रत्येक आयाम में 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;
पुनश्च: मुझे पता है कि True
को Metafile.Enhanced
की स्थापना और एक .emf फ़ाइल के रूप में सहेजने समस्या का समाधान होगा, लेकिन गंतव्य अनुप्रयोग है कि मैं मैं फ़ाइलों को उत्पन्न करने के लिए एन्हांस्ड मेटाफाइल का समर्थन नहीं करता हूं।
संपादित करें: नीचे जवाब में उल्लेख किया है, वहाँ दो अलग अलग यहां समस्याएं हैं:
मुख्य समस्या, फ़ाइल स्वयं के बारे में है यह प्रत्येक आयाम पर एक 2^15 सीमित है। यदि ड्राइंग की चौड़ाई या ऊंचाई इस मान को पार करती है, तो डेल्फी दूषित फ़ाइल लिखेंगे। आप Sertac's answer में अधिक जानकारी प्राप्त कर सकते हैं।
दूसरी समस्या फ़ाइल को TImage
में लोड करने के बारे में है। जब आप डेल्फी वीसीएल एप्लिकेशन में छवि दिखाना चाहते हैं तो एक और सीमा है। यह एक प्रणाली निर्भर है और डीसी के डीपीआई से संबंधित है कि चित्रण को चित्रित किया जा रहा है। Tom's answer विवरण में इसका वर्णन करता है। 0.7 के रूप में Scale
DrawWMF
(ऊपर कोड नमूना) इस पीसी को मेरे पीसी पर पुन: उत्पन्न करता है। जेनरेट की गई फ़ाइल ठीक है और अन्य मेटाफाइल दर्शक (मैं एमएस ऑफिस पिक्चर मैनेजर का उपयोग करता हूं) के साथ देखा जा सकता है लेकिन वीसीएल इसे दिखाने में विफल रहता है, हालांकि, फाइल लोड करते समय कोई अपवाद नहीं उठाया जाता है।
मैं WinAPI के रूप में फिर से टैग किए गए के बाद से इस है, मैं नहीं बल्कि विश्वास है, WMF प्रारूप बारे में एक प्रश्न से संबंधित कुछ भी की तुलना में: आप एक साधारण मानसिक स्वास्थ्य की जांच के बाद आप छवियों लोड किया है उन्हें ठीक से प्रदर्शित करने के लिए के लिए प्रदर्शन कर सकते हैं डेल्फी। –
क्या आप सुनिश्चित हैं कि आपकी सीमा लगभग 25000 है? क्या यह शायद, वास्तव में, 32767 हो सकता है? –
यह प्रतीत होता है कि यह कुल क्षेत्र (चौड़ाई × ऊंचाई) के आधार पर स्मृति आवंटन विफलता है। –