Я работаю над перестройкой системы на основе Access в c # .net, однако, когда MS перешел из офиса 2003 в офис 2007, они удалили редактор изображений в рамках доступа - это означало, что ранее сохраненные изображения больше не будут отображаться в системе. Ребята из компании сделали хак, который в основном сохранил изображения с VBA, используя Excel в фоновом режиме (я могу получить больше информации, если вам это нужно), но в основном это означало, что все еще можно использовать элементы управления доступом к изображениям (рамки, связанные с объектом).
Однако теперь у меня возникла проблема с попыткой отобразить их в приложениях .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);
}
Этот код был адаптирован с здесь , мне не требовалась идентификация различных типов документов, так как я имею дело только с изображениями, однако тип изображения может быть любым: jpg, bmp, gif , PNG и т. д.
Я также пытался сохранить выведенный байтовый массив, но мне тоже не повезло, просматривая его. Но когда я указываю доступ к базе данных и просматриваю ее, все в порядке. Кроме того, дизайнер .NET Crystal Report может каким-то образом получить эти изображения, поэтому они должны быть где-то там ...
У кого-нибудь есть идеи?
Marlon