2016-10-24 4 views
0

Я пытаюсь сохранить BitmapImage (System.Windows.Media.Imaging) через memystream, чтобы результат можно было использовать для создания Bitmap (System.Drawing).C# BitmapImage AccessViolationException при сохранении как MemoryStream

Я периодически получаю сообщение об ошибке при попытке сохранить закодированный результат в MemoryStream:

An exception of type 'System.AccessViolationException' occurred in PresentationCore.dll but was not handled in user code 

Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 

Свойства MemoryStream, кажется, указывают, что чтение или запись тайм-аут произошел.

WriteTimeout = 'msOut.WriteTimeout' threw an exception of type 'System.InvalidOperationException' 

код ниже, ошибка выдается по команде Save:

  System.Windows.Media.Imaging.CroppedBitmap cbi = new System.Windows.Media.Imaging.CroppedBitmap(bi, new System.Windows.Int32Rect(
      (int)(imageViewBox[2] * imageViewBox[10]), (int)(imageViewBox[3] * imageViewBox[11]), 
      (int)((imageViewBox[4] - imageViewBox[2]) * imageViewBox[10]), (int)((imageViewBox[5] - imageViewBox[3]) * imageViewBox[11]))); 
     newImageSize = new Size(cbi.PixelWidth, cbi.PixelHeight); 

     using (MemoryStream msOut = new MemoryStream()) 
     { 
      System.Windows.Media.Imaging.BmpBitmapEncoder enc = new System.Windows.Media.Imaging.BmpBitmapEncoder(); 
      enc.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(cbi)); 
      // Throws access violation exception when zoomed on some images. Why? 
      enc.Save(msOut); 
      using (Bitmap temp = new Bitmap(msOut)) 
      { ... 

Изображения в вопросе, как правило, 1000px х 500 так не массивный. Любые идеи, что может быть причиной этого? Или какие-либо идеи, как еще я мог бы сделать преобразование без использования запоминающего устройства (без ухудшения производительности?)

ответ

0

Оказывается, исходное битовое изображение для обрезанной битовой карты (не показано в приведенном выше коде) вызывало проблему.

Это битовое изображение загружалось с диска с помощью URI. Я обнаружил, что установка BitmapCacheOption на Onload вместо None устраняет ошибку. Я предполагаю, что изображение не было полностью загружено в момент преобразования. Однако это снижает производительность примерно в три раза, что является неудачным.

Смежные вопросы