2011-09-07 10 views
6

मेरे पास एक नियमित procedure DrawStuff(ACanvas: TCanvas; const ARect: TRect) है जो टीसीएनवास पर निर्दिष्ट आयत में कुछ खींचता है। फिलहाल मैं एक पेंटबॉक्स के कैनवास के साथ DrawStuff पर कॉल करता हूं। अब मैं Save as विकल्प जोड़ रहा हूं, जिसमें उपयोगकर्ता DrawStuff के परिणामों को सहेजने के लिए विभिन्न प्रकार के फ़ाइल स्वरूपों (बीएमपी, डब्ल्यूएमएफ, जेपीजी, ... - जितना संभव हो सके उतने टीजीआरएफसी वंशजों) से चयन करने में सक्षम होंगे। ।विभिन्न प्रकार के फ़ाइल प्रारूपों में चित्र सहेजें

TMetafile पर आरेखण और इसे "bla.bmp" या Assign के रूप में सहेजकर इसे TPicture पर सही ढंग से काम नहीं करता है - उदा। यह एक्सटेंशन ".bmp" के साथ फाइलें उत्पन्न करता है जो बिटमैप्स नहीं हैं। - उपयोग TBitmap.Canvas

  • bmp: अभी मैं एक समाधान है कि विशेष आवरण हर एक फ़ाइल स्वरूप को शामिल नहीं करता समझ नहीं सकता।
  • wmf/emf: TMetafileCanvas का उपयोग करें।
  • आदि आदि

क्या आप जानते हैं मेरे लिए किसी भी विचार है?

+2

बीएमपी, पीएनजी, जीआईएफ, जेपीजी, आदि को बचाने के लिए 'वर्दी' दिनचर्या बनाना बहुत आसान है, लेकिन अगर यह डब्लूएमएफ या ईएमएफ को शामिल करना भी है तो इसे करना मुश्किल है, क्योंकि बाद वाले * वेक्टर छवि * स्वरूप, जबकि पूर्व * रास्टर छवि * प्रारूप हैं। बेशक, आप छवि को अपने ईएमएफ/डब्लूएमएफ में एम्बेडेड रास्टर बिटमैप के रूप में सहेजना चुनते हैं, लेकिन ऐसे मामले में यह ईएमएफ/डब्लूएमएफ प्रारूप का उपयोग करने के लिए सादा मूर्ख है ... –

+0

स्पेशल-कैसिंग डब्ल्यूएमएफ/एमएमएफ ठीक होगा क्या आप मुझे एक समान दिनचर्या के लिए पॉइंटर्स दे सकते हैं? –

+0

पीएस: मैंने सोचा था कि एक मेटाफाइल पर ड्राइंग करना और फिर इसे 'टीपीचित्र' पर 'असाइन करना' काम कर सकता है क्योंकि यह रिकॉर्ड किए गए जीडीआई कॉल के संग्रह की तरह कुछ लगता है। –

उत्तर

9

मैं एक "गूंगा" रूपांतरण होगा शायद के रूप में सरल रूप में यह लगता है:

type 
    TGraphicTypeEnum = (gteBMP, gteJPG, gteTIF, gtePNG); 

procedure SaveGraphicAs(AGraphic : TGraphic; AGraphicType : TGraphicTypeEnum; AFileName : String); 
var vGraphicClass : TGraphicClass; 
    vTargetGraphic : TGraphic; 
    vBmp : TBitmap; 
begin 

    case AGraphicType of 
    gteBMP : vGraphicClass := TBitmap; 
    gtejpg : vGraphicClass := TJPEGImage; 
    gtetif : vGraphicClass := TWICImage; 
    gtepng : vGraphicClass := TPngImage; 
    else 
    // EXIT; or raise... 
    end; 
    if aGraphic is vGraphicClass then //As suggested by Rob Kennedy 
    AGraphic.SaveToFile(AFileName) 
    else 
    begin 
    vBmp := nil; 
    vTargetGraphic := vGraphicClass.Create; 
    try 
     vBmp := TBitmap.Create; 
     vBmp.Assign(AGraphic); 
     vTargetGraphic.Assign(vBmp); 
     vTargetGraphic.SaveToFile(aFileName); 
    finally 
     vTargetGraphic.Free; 
     vBmp.Free; 
    end; 
    end; 
end; 

एक TPicture को असाइन करना है जब आप एक TPicture को असाइन के रूप में, काम नहीं किया, TPicture वर्ग के लिए ग्राफिक में परिवर्तित कर देंगे आप से असाइन कर रहे हैं।

ध्यान दें कि मेरे उदाहरण में, रूपांतरण की 2 परतें हैं क्योंकि मूल छवि को अंतिम प्रारूप में परिवर्तित करने से पहले बिटमैप में परिवर्तित किया गया है। प्रक्रिया में जानकारी का काफी नुकसान हो सकता है। अधिकांश (सभी?) ग्राफ़िक प्रकार को पता है कि टीबीटमैप से कैसे और कैसे परिवर्तित किया जाए, लेकिन TJPEGImage को पता नहीं है कि TPngImage में कैसे परिवर्तित करें और इसके विपरीत।

अधिक कुशल रूपांतरण विधि विकसित की जा सकती है जो पारदर्शीता और फ़ाइल प्रारूप के लिए विशिष्ट अन्य प्रभाव रखती है, लेकिन यह मेरा ज्ञान है। लेकिन आपकी जरूरतों के आधार पर, यह पर्याप्त हो सकता है।

+0

'अगर एग्रीफ़िक vGraphicClass' है तो यह संभवतः सार्थक है और यदि यह सत्य है तो बिटमैप रूपांतरण को छोड़ दें। अन्यथा, जेपीईजी को जेपीईजी के रूप में सहेजते समय भी आप छवि की गुणवत्ता खो देंगे। –

+0

या फ़ंक्शन SaveGraphicAs को कॉल करने को छोड़ दें और केवल एग्रीफ़िक को कॉल करें। सेवटोफाइल। वहां कुछ अन्य मुद्दे हैं जो फसल निकाल सकते हैं। एक तीसरी पार्टी अपनी पीएनजी कक्षा पंजीकृत कर सकती है (डेवएक्सप्रेस वह करता है)। तो आप 'TdxPNGImage के साथ समाप्त हो जाएगा TPNGImage' (जो गलत होगा)। किसी दिए गए एक्सटेंशन के लिए वर्तमान में पंजीकृत कक्षा प्राप्त करने के लिए इस समय दुख की बात नहीं है (2008-01-24 को अनुरोध किया गया QC57402 ... अभी भी खुला है)। कॉलर के लिए यह पता लगाना शायद आसान है कि ग्राफिक पहले से ही उचित प्रारूप में है या नहीं। लेकिन हाँ, मुझे लगता है कि यह अनुकूलन करने के लिए चोट नहीं पहुंची होगी। –

संबंधित मुद्दे