में उपयोग के लिए एमएस एक्सेस से ओएलई छवि ऑब्जेक्ट को कनवर्ट करना मैं सी # नेट में एक एक्सेस आधारित सिस्टम का पुनर्विकास करने पर काम कर रहा हूं, हालांकि जब एमएस ऑफिस 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 क्रिस्टल रिपोर्ट डिज़ाइनर इन छवियों को कुछ कैसे प्राप्त करने में सक्षम है - इसलिए उन्हें कहीं कहीं होना चाहिए ...
क्या किसी को कोई विचार है?
मार्लोन
जानकारी के लिए धन्यवाद लेकिन मुझे लगता है कि आप समस्या को गलत समझते हैं। वह आलेख बताता है कि एक छवि फ़ाइल को डेटाबेस में कैसे स्टोर किया जाए। एक छवि में पहले से संग्रहीत ओएलई ऑब्जेक्ट को कन्वर्ट करने का तरीका नहीं है। जाहिर है ओएलई सिर्फ जादू है ... – Marlon