Если вы читаете данные напрямую из MS Access, вам не нужно удалять какую-либо информацию заголовка.
Предполагается, что изображение хранится как BLOB , что является наиболее распространенным, вот код для чтения в массив байтов из базы данных и сохранения в виде файла изображения (извините, VB вместо C # ):
Dim varBytes() As Byte
Using cn As New OleDbConnection(myConnectionString)
cn.Open()
sqlText = "SELECT [myColumn] " _
& "FROM [myTable] " _
& "WHERE ([mySearchCriteria] = '" & mySearchTerm & "')"
Using cm As New OleDbCommand(sqlText, cn)
Dim rdr As OleDbDataReader
rdr = cm.ExecuteReader
rdr.Read()
varBytes = rdr.GetValue(0)
End Using
End Using
My.Computer.FileSystem.WriteAllBytes(myPath & "\myFile.emf", varBytes, True)
В этом примере, который я лежал, я знал, что файлы в базе данных были .emf-изображениями. Если вы знаете расширение, вы можете указать его в имени файла. Если вы этого не сделаете, вы можете оставить его пустым, а затем открыть результат с помощью средства просмотра изображений; это должно начаться. Если вам нужно найти расширение или тип файла, после того, как оно сохранено в виде файла, вы можете открыть его в любом шестнадцатеричном редакторе, и тип файла будет доступен из информации заголовка.
Ваш вопрос немного неясен, поэтому я не уверен, что приведенный выше код - именно то, что вы хотите, но он должен сделать вас намного ближе.
EDIT:
Это код VB, который принимает массив байтов, загружает его в объект MemoryStream и затем создает объект Image из потока. Этот фрагмент кода работал просто отлично и отображал изображение в окне для рисования в моей форме.
Dim img As Image
Dim str As New MemoryStream(varBytes)
img = Image.FromStream(str)
PictureBox1.Image = img
Если C # -эквивалент этого не работает для вас, проблема, вероятно, заключается в том, как изображение хранится в базе данных MS Access.
EDIT:
Если изображение в вашей базе данных хранится как «Пакет», а не как «Длинные двоичные данные», вам нужно будет удалить информацию заголовка, которую добавляет MS Access. Я играл с хранилищем изображений типа «Пакет» с простым файлом .jpg. Заголовок в этом случае намного длиннее 78 байт. В данном случае это фактически 234 байта, и MS Access также добавил некоторую информацию в конец исходного файла; в данном случае около 292 байта.
Похоже, ваш первоначальный подход был верным, вам просто нужно определить, сколько байтов нужно убрать с передней и задней части массива байтов для вашей ситуации.
Я определил его для своего файла, сравнив исходный файл изображения и файл, экспортированный из базы данных (не в объект Stream, см. Мой первый код) в шестнадцатеричном редакторе. Как только я выяснил, сколько информации (заголовок и нижний колонтитул) было добавлено MS Access, я понял, сколько байтов нужно удалить.
EDIT:
Размер заголовка, добавляемого MS Access, когда изображение сохраняется как «Пакет», варьируется в зависимости от типа файла и исходного местоположения (информация о полном пути) изображения, когда оно было выгружено в базу данных MS Access. Таким образом, даже для одного и того же типа файла у вас может быть разное количество байтов для удаления из заголовка для каждого файла.
Это значительно усложняет задачу, потому что тогда вам придется сканировать байтовый массив до тех пор, пока вы не найдете нормальную информацию о начале файла для этого типа файла, а затем убрать все перед ним.
Вся эта головная боль является одной из причин, по которой лучше хранить изображения в виде больших двоичных данных в базе данных. Поиск гораздо проще. Я не знаю, есть ли у вас возможность сделать это, но если это так, это было бы хорошей идеей.