2017-01-16 21 views
1

Я пытаюсь использовать SharpDX для рисования большого изображения (21000x7000) из файла.Просмотр большого изображения с SharpDX

код выглядит следующим образом:

 if (newBitmap==null) 
     { 
      ImagingFactory imagingFactory = new ImagingFactory(); 
      NativeFileStream fileStream = new NativeFileStream(@"D:\path\myfile.png", 
       NativeFileMode.Open, NativeFileAccess.Read); 

      BitmapDecoder bitmapDecoder = new BitmapDecoder(imagingFactory, fileStream, DecodeOptions.CacheOnDemand); 
      BitmapFrameDecode frame = bitmapDecoder.GetFrame(0); 

      FormatConverter converter = new FormatConverter(imagingFactory); 
      //                  Format32bppPArgb 
      //                  Format32bppPRGBA 
      converter.Initialize(frame, SharpDX.WIC.PixelFormat.Format32bppPRGBA); 

      newBitmap = SharpDX.Direct2D1.Bitmap1.FromWicBitmap(target, converter); 
     } 
     target.DrawBitmap(newBitmap,new RawRectangleF(0,0,target.Size.Width,target.Size.Height),1,BitmapInterpolationMode.Linear); 

При выполнении, я получаю следующее исключение в FromWicBitmap функции:

Exception thrown: 'SharpDX.SharpDXException' in SharpDX.dll 

Additional information: HRESULT: [0x80070057], Module: [General], ApiCode: [E_INVALIDARG/Invalid Arguments], Message: The parameter is incorrect. 

Когда я изменить размер изображения до 2100x700, он загружает и отображает просто отлично, поэтому проблема заключается в размере изображения.

Я хочу изображение этого размера, потому что позже планирую добавить функцию масштабирования.

Я совершенно не знаком с Direct2D. Каков наилучший способ справиться с этим?

+1

Вам действительно нужно включить отладку DirectX, чтобы получить основную причину проблемы. Это описано здесь http://stackoverflow.com/questions/3331240/how-to-enable-more-debugging-info-for-directx-variables-in-vs-2008 – PhillipH

ответ

1

Из вашего описания кажется, что проблема превышает пределы размера текстуры Direct3D (Direct2D использует Direct3D для своей работы, поэтому он имеет те же ограничения).

Если посмотреть на Max Texture Dimension в Direct3D Feature Level table вы увидите, что в диапазоне от до 16384 пикселей в зависимости от уровня графического оборудования. Вы можете:

  • предположить +4096 ваш предел (это то, что вы должны сделать, если вы работаете эту программу на различных компьютерах, имеют различные видеокарты)
  • запустить dxdiag.exe, нажав кнопку «Показать 1 ", и ищет Feature Levels или DDI, чтобы узнать, какие функциональные уровни доступны.

Решение заключается в изменении размера изображения до тех пор, пока оно не будет соответствовать границам пикселей перед вызовом target.DrawBitmap. Другими словами, вы не можете делать масштабирование работать так же легко, как вам может понравиться - даже если вы увеличиваете и уменьшаете текстуру, в какой-то момент вам придется перепрограммировать или она будет более пиксельной, чем исходное изображение.

+0

Или в этом случае вы могли бы разделить большие изображение в куски 4-пиксельных изображений и нарисовать их отдельно. Я думаю, это то, о чем попросил ОП. – SharpShade

+0

@SharpShade Просмотрев API онлайн, RenderTarget.DrawBitmap, похоже, не поддерживает информацию о позиционировании, поэтому резка растрового изображения просто отображает одну часть поверх другой. Нет простого способа сделать это и переписать код, чтобы сделать что-то более сложное, более сложное, чем просто изменить размер изображения. Я обновляю свой ответ на ссылку масштабирования. – NextInLine

+0

Ну, я не работал с Direct2D, но кажется странным использовать этот метод для рисования текстуры, не так ли? Тогда я предполагаю, что единственным обходным решением будет рисовать его по-другому и трансформировать через матрицы. Но возможно в любом случае - хотя понижающая дискретизация приведет к уменьшению масштабирования с более высоким разрешением. – SharpShade