.NET

2010-03-10 2 views
6

में उपयोग के लिए एमएस एक्सेस से ओएलई छवि ऑब्जेक्ट को कनवर्ट करना मैं सी # नेट में एक एक्सेस आधारित सिस्टम का पुनर्विकास करने पर काम कर रहा हूं, हालांकि जब एमएस ऑफिस 2003 से ऑफिस 2007 तक चला गया तो उन्होंने तस्वीर संपादक को एक्सेस के भीतर हटा दिया - जो मतलब था कि पहले संग्रहीत चित्र सिस्टम में प्रदर्शित नहीं होंगे। कंपनी के लोगों ने एक हैक किया जो मूल रूप से पृष्ठभूमि में एक्सेल का उपयोग करके वीबीए के साथ छवियों को सहेजता है (यदि आपको इसकी आवश्यकता हो तो मैं अधिक जानकारी प्राप्त कर सकता हूं) लेकिन मूल रूप से इसका मतलब है कि एक्सेस छवि नियंत्रण अभी भी उपयोग किया जा सकता है (ऑब्जेक्ट बाउंड फ्रेम)।.NET

हालांकि, अब मुझे इन्हें .NET अनुप्रयोगों में प्रदर्शित करने की कोशिश करने की समस्या है, और बाइट सरणी में हेरफेर करने के विभिन्न तरीकों की कोशिश करने के अनगिनत दिनों के बाद मैं छोड़ने के करीब हूं। मैंने कम से कम 8 अलग-अलग सुझाए गए समाधानों की कोशिश की है और Image.fromStream() करते समय प्रत्येक एक 'पैरामीटर पहचान नहीं है' अपवाद के साथ समाप्त होता है। नीचे दिए गए कोड जो मुझे सबसे करीब अब तक मिल गया है है:

private void imageExtractTest() 
    { 
     LogOnDataSetTableAdapters.QueriesTableAdapter qa = 
      new LogOnDataSetTableAdapters.QueriesTableAdapter(); 

     object docO = qa.GetLogonImage(); 
     if (docO == null || !(docO is byte[])) 
     { 
      return; 
     } 
     byte[] doc = (byte[])docO; 

     MemoryStream ms = new MemoryStream(); 
     ms.Write(doc, 0, doc.Length); 
     int firstByte; 
     int secondByte; 
     ms.Seek(0, SeekOrigin.Begin); 
     firstByte = ms.ReadByte(); 
     secondByte = ms.ReadByte(); 

     if (firstByte != 0x15 && secondByte != 0x1C) 
     { 
      //ErrorResponse("Stored object is not an Access File."); 
      return; 
     } 

     int fileTypeLoc = 20; // begin of the file type 
     short offset; // end of the file type 

     byte[] buffer = new byte[2]; 
     ms.Read(buffer, 0, 2); 
     offset = BitConverter.ToInt16(buffer, 0); 

     long seekTotal = 0; 
     seekTotal += offset; 

     string docType = String.Empty; 
     for (int i = fileTypeLoc; i < offset; i++) 
     { 
      docType += (char)doc[i]; 
     } 

     //if I query docType now I get 'Picture\0\0' 

     // magic eight bytes 01 05 00 00 03 00 00 00 
     ms.Seek(seekTotal, SeekOrigin.Begin); 
     buffer = new byte[8]; 
     ms.Read(buffer, 0, 8); 
     seekTotal += 8; 

     // Second offset to move to 
     buffer = new byte[4]; 
     ms.Read(buffer, 0, 4); 
     seekTotal += 4; 
     long offset2 = BitConverter.ToInt32(buffer, 0); 
     seekTotal += offset2; 
     ms.Seek(seekTotal, SeekOrigin.Begin); 

     // eight empty bytes 
     buffer = new byte[8]; 
     ms.Read(buffer, 0, 8); 
     seekTotal += 8; 

     // next n bytes are the length of the file 
     buffer = new byte[4]; 
     ms.Read(buffer, 0, 4); 
     seekTotal += 4; 
     long fileByteLength = BitConverter.ToInt32(buffer, 0); 

     // next N bytes are the file 
     byte[] data = new byte[fileByteLength]; 

     // store file bytes in data buffer 
     ms.Read(data, 0, Convert.ToInt32(fileByteLength)); 

     MemoryStream imageStream = new MemoryStream(data); 
     Image test = Image.FromStream(imageStream); 
    } 

इस कोड here से अनुकूलित किया गया था, मैं के रूप में मैं केवल छवियों के साथ काम कर रहा हूँ विभिन्न doctypes पहचान जरूरत नहीं थी, फिर भी छवि प्रकार कर सकते थे चीजों की कोई संख्या हो - jpg, bmp, gif, png आदि

मैंने आउटपुट बाइट सरणी को सहेजने का भी प्रयास किया है, लेकिन मुझे कोई भाग्य देखने की ज़रूरत नहीं है। लेकिन जब मैं डेटाबेस तक पहुंच इंगित करता हूं और इसे देखने के लिए मिलता हूं, तो सब कुछ ठीक है। इसके अलावा .NET क्रिस्टल रिपोर्ट डिज़ाइनर इन छवियों को कुछ कैसे प्राप्त करने में सक्षम है - इसलिए उन्हें कहीं कहीं होना चाहिए ...

क्या किसी को कोई विचार है?

मार्लोन

उत्तर

3

नेट से एक MS-पहुँच OLE छवि क्षेत्र को पुनः प्राप्त करने की कोशिश कर रहा तरह से अधिक सिर दर्द की तुलना में यह लायक है। this post में इस विषय के बारे में कुछ अच्छी चर्चा और जानकारी है।

आखिरकार, आपका सबसे अच्छा और आसान, समाधान सफल होने का समाधान है, इन छवियों को अलग फ़ाइलों के रूप में सहेजने के लिए अपनी कार्यप्रणाली देखने विधि का उपयोग करना है, फिर छवि फ़ाइलों के बजाय उन फ़ाइलों को डेटाबेस में BLOB फ़ील्ड के रूप में आयात करें। फिर आप उन्हें आसानी से .NET में पढ़ सकते हैं।

0

माइक्रोसॉफ्ट से इस KB http://support.microsoft.com/kb/317701 आलेख को आजमाएं। इसमें जानकारी से छवि ब्लॉब तक पहुंचने और Winforms एप्लिकेशन में प्रदर्शित करने के तरीके के बारे में जानकारी शामिल है।

+0

जानकारी के लिए धन्यवाद लेकिन मुझे लगता है कि आप समस्या को गलत समझते हैं। वह आलेख बताता है कि एक छवि फ़ाइल को डेटाबेस में कैसे स्टोर किया जाए। एक छवि में पहले से संग्रहीत ओएलई ऑब्जेक्ट को कन्वर्ट करने का तरीका नहीं है। जाहिर है ओएलई सिर्फ जादू है ... – Marlon

0

यह सी # कोड नहीं है लेकिन इस समस्या को हल करने के लिए यहां एक Delphi example है।

कच्चे डेटा को पढ़ने की कोशिश करने के बजाय जो भी संग्रहीत किया जाता है उसे आकर्षित करने के लिए IOLEObject का उपयोग करता है। कदम:

  1. OLE ऑब्जेक्ट के सामने पहुँच हैडर पढ़ें
  2. बाहर पढ़ें OLE1 धारा
  3. एक OLE2 IStorage वस्तु में कनवर्ट OLE1 धारा
  4. उपयोग OLELoad करने के लिए "रन" OLE Ojbect।
  5. अपनी पसंद के कैनवास पर छवि खींचने के लिए OLEDraw पर कॉल करें।
1

मेरे मामले में निम्न कार्य किया गया। डेटा एक वीबी 6 आवेदन द्वारा संग्रहीत किया जाता है।

public static byte[] ConvertOleBytesToRawBytes(byte[] oleBytes) 
{ 
    // The default encoding is in my case - Western European (Windows), Code Page 1252 
    return Encoding.Convert(Encoding.Unicode, Encoding.Default, (byte[])oleBytes); 
} 
संबंधित मुद्दे