2011-06-06 15 views
8

अगर मैं इसे सही ढंग से समझता हूं, TImage.LoadFromFile फ़ाइल एक्सटेंशन से चित्र का प्रकार निर्धारित करता है।बीएलओबी स्ट्रीम से एक टीआईएमएज में मनमाने ढंग से छवि कैसे लोड करें?

क्या TBlobStream से स्वचालित रूप से छवि प्रकार का पता लगाने का कोई तरीका है जिसमें कच्ची छवि है?

मेरे वर्तमान कोड:

procedure LoadImageFromStream(AImage: TImage; ADataSet: TDataSet); 
var 
    Stream: TStream; 
begin 
    Stream := ADataSet.CreateBlobStream(Field, bmRead); 
    try 
    AImage.Picture.Graphic.LoadFromStream(Stream); 
    finally 
    Stream.Free; 
    end; 
end 

उत्तर

16

हेडर से फ़ाइल सामग्री पुनर्प्राप्ति के लिए यह SO answer देखें।

या आप हमारे TSynPicture class का उपयोग कर सकते हैं, जो एक एकल कक्षा में जीडीआई + लाइब्रेरी का उपयोग कर सभी प्रकार की तस्वीरें (बीएमपी/जीआईएफ/टिफ़/जेपीजी/पीएनजी) को संभालेगा। तो आपकी TPicture किसी भी प्रकार की तस्वीर के लिए यह अनूठी कक्षा हो सकती है। जेपीईजी या पीएनजी डेल्फी इकाइयों की तुलना में कम कोड ओवरहेड के साथ। (कच्चा कहने के लिए नहीं)

var Pic: TSynPicture; 

Pic := TSynPicture.Create; 
Pic.LoadFromStream(aStream); // will load bmp/gif/tiff/jpeg/png content 
AImage.Picture.Graphic := Pic; 
.... 
+0

यदि आप टीआईएनआईपीचित्र को जीआईएफ/पीएनजी/जेपीजी/टीआईएफएफ छवियों को लोड करना चाहते हैं, तो SynGdiPlus.pist के स्रोत कोड में NOTSYNPICTUREREGISTER की परिभाषा पर टिप्पणी करें। –

2

वास्तव में यह TPicture.LoadFromFile उस फ़ाइल प्रकार का पता लगाता है, और यह सिर्फ फाइल एक्सटेंशन का उपयोग करता है। इसलिए फ़ाइल प्रकार का पता लगाने के लिए आपको स्ट्रीम के शीर्षलेख को पढ़ने की आवश्यकता होगी।

दूसरी तरफ, यदि आप जानते हैं कि प्रारूप में जब आप BLOB को डेटाबेस में डालते हैं तो आप हमेशा उस जानकारी को BLOB पर अपने निजी हेडर के रूप में शामिल कर सकते हैं।

+2

"धारा के शीर्षक पढ़ें" और: कैसे DFM धारा से TPicture भार ही है, लेकिन यह नहीं एक अपवाद है एक उत्सुक हो सकता है, यहां कार्यान्वयन से प्रासंगिक अंश है (कॉपीराइट कोड केवल उदाहरण प्रयोजन के लिए प्रदान की गई) क्रिस रोलिस्टन ब्लॉग पोस्ट समस्या का समाधान कर रहा है :) – RBA

0

कदाचित जादू TPicture मनमाने ढंग से छवि प्रारूप के लिए चालाक से निपटने वास्तव में बहुत सरल है। फाइल एक्सटेंशन से लोड हो रहा है फाइल एक्सटेंशन पर निर्भर करता है। क्लिपबोर्ड से लोड हो रहा है - क्लिपबोर्ड प्रारूप सूचक पर। देख? हमेशा प्रारूप टैग होता है जो TPicture को निर्देश देता है जो TGraphicClass डेटा पर उपयोग करने के लिए करता है, और TGraphic बेस क्लास स्वयं परीक्षण-और-त्रुटि दृष्टिकोण के नीचे "स्वयं" डेटा स्ट्रीम की पहचान करने के लिए कोई तंत्र प्रदान नहीं करता है।

procedure TPicture.ReadData(Stream: TStream); 
var 
    {...} 
    GraphicClass: TGraphicClass; 
    LClassName: string; 
    LBytes: TBytes; 
    LNameLen: Byte; 
begin 
    Stream.Read(LNameLen, 1); 
    SetLength(LBytes, LNameLen); 
    Stream.Read(LBytes{$IFNDEF CLR}[0]{$ENDIF}, LNameLen); 
    LClassName := TEncoding.UTF8.GetString(LBytes); 

    GraphicClass := FileFormats.FindClassName(LClassName); 
+0

... इसलिए यह चित्र बाइनरी हेडर का उपयोग करने के बजाय डीएफएम स्ट्रीम से संबंधित टीपीचित्र वर्ग का नाम पढ़ता है। इसलिए आप उदाहरण के लिए जेपीईजी लोडिंग लाइब्रेरीज़ को मिश्रण नहीं कर सकते हैं, या आपको सभी कार्यान्वयन 'TJpegImage' नाम देना होगा (यही वह है जिसे मैंने * SynGdiPlus * के लिए बनाया है जो उपयोगकर्ता कोड और डीएफएम में मानक' जेपीजी 'इकाई के साथ संगत होने के लिए है लोड हो रहा है)। –

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