Преобразование Объекта изображения OLE от Доступа MS для использования в.NET

Я работаю над перестройкой основанной на доступе системы в 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);
    }

Этот код был адаптирован отсюда, мне не была нужна различная doctypes идентификация, поскольку я только имею дело с изображениями, однако тип изображения мог быть любым количеством вещей - jpg, bmp, gif, png и т.д.

Я также попытался сохранить произведенный массив байтов, но у меня не было удачи при просмотре этого также. Но когда я указываю на доступ к базе данных и заставляю это просматривать его, все прекрасно. Также Конструктор отчетов Кристалла.NET может получить эти изображения некоторые, как - таким образом, они должны быть там где-нибудь...

Кто-либо получил какие-либо идеи?

Marlon

7
задан Marlon 16 September 2011 в 11:41
поделиться

2 ответа

Попытка получить поле изображения OLE для MS-доступа из .NET - гораздо больше головной боли, чем она того стоит. В этом посте есть хорошее обсуждение и информация по этой теме.

В конечном счете, лучшее и самое простое решение для достижения успеха - использовать рабочий метод просмотра для сохранения этих изображений в виде отдельных файлов, а затем импортировать эти файлы в базу данных как поля BLOB, а не как поля изображений. Затем вы можете легко прочитать их в .NET.

3
ответ дан 7 December 2019 в 12:18
поделиться

Попробуйте эту статью KB http://support.microsoft.com/kb/317701 от microsoft. В ней содержится информация о том, как получить доступ к блобу изображения из access и отобразить его в приложении winforms.

0
ответ дан 7 December 2019 в 12:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: