Чтение файла WMF из базы данных, преобразование в растровое изображение - PullRequest
0 голосов
/ 10 октября 2009

Я понял, что мой первый вопрос не будет отвечать, поскольку php не может справиться с этим форматом: https://stackoverflow.com/questions/1376103/how-to-convert-metafilepict-to-bitmapped-image-in-php,, поэтому у меня есть консольное приложение C #, которое просто загружает изображения из любого MS SQL 2008 db или Access 2007, а затем сохраните их в каталоге.

Изображения были изначально сохранены в виде файла Windows Media (WMF) в базе данных доступа.

Итак, у меня есть следующий код с ошибкой в ​​последней строке:

byte[] mybytes = (byte[])sdr["LocationMap"];
System.IO.MemoryStream ms =
       new System.IO.MemoryStream(mybytes);
System.Drawing.Bitmap b =
  (System.Drawing.Bitmap)System.Drawing.Image.FromStream(ms);                        

Столбец «LocationMap» на сервере sql является varbinary, а в Access - изображение.

Как я могу загрузить это из одной из двух баз данных, чтобы я мог сохранить его как растровое изображение?

Это была моя ошибка:

A first chance exception of type 'System.ArgumentException' occurred in System.Drawing.dll
System.Transactions Critical: 0 : <TraceRecord xmlns="http://schemas.microsoft.com/2004/10/E2ETraceEvent/TraceRecord" Severity="Critical"><TraceIdentifier>http://msdn.microsoft.com/TraceCodes/System/ActivityTracing/2004/07/Reliability/Exception/Unhandled</TraceIdentifier><Description>Unhandled exception</Description><AppDomain>ConvertWMFToFile.vshost.exe</AppDomain><Exception><ExceptionType>System.ArgumentException, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</ExceptionType><Message>Parameter is not valid.</Message><StackTrace>   at System.Drawing.Image.FromStream(Stream stream, Boolean useEmbeddedColorManagement, Boolean validateImageData)
   at System.Drawing.Image.FromStream(Stream stream)

ОБНОВЛЕНИЕ: Это была моя другая неудачная попытка:

//imageBytes = sdr.GetSqlBytes(2);
//var stream = imageBytes.Stream;
//stream.Seek(0, SeekOrigin.Begin);
//locmod.LocationImage = new Metafile(stream);

Update2: я только что попробовал это и получил общую ошибку GDI +:

byte[] mybytes = (byte[])sdr["LocationMap"];
var f = File.Create("tempfile.wmf");
f.Write(mybytes, 0, locmod.LocationImageBytes.Length);
f.Close();
var myimage = new Metafile("tempfile.wmf");

Ошибка:

System.Runtime.InteropServices.ExternalException was unhandled
  Message="A generic error occurred in GDI+."
  Source="System.Drawing"
  ErrorCode=-2147467259
  StackTrace:
       at System.Drawing.Imaging.Metafile..ctor(String filename)

Ответы [ 2 ]

1 голос
/ 11 октября 2009

Вы можете найти код в базе данных образца Стивена Лебанса с подсветкой:

Это не относится к WMF - оно работает для любого поля OLE. Я использовал его 4 месяца назад для извлечения нескольких документов Word из клиентской базы данных, и он работал нормально (хотя некоторые поля, заполненные более ранними версиями Word, не могли быть извлечены).

1 голос
/ 10 октября 2009

Вы пробовали класс Metafile, чтобы загрузить его?

http://msdn.microsoft.com/en-us/library/wb42xhfh.aspx

...