2013-08-03 2 views
1

Поскольку GDI + довольно (смешно) медленно, я решил перейти на Direct2D. Я искал много тем на многих форумах (в том числе this one), но без успеха (это также может быть вызвано тем, что это довольно поздно), и документация Direct2D довольно тонкая (и смущает, по крайней мере, для меня).Рисование части изображения в Direct2D

Во всяком случае, у меня есть .PNG, который я открываю в Direct2D и хочу нарисовать только часть его один раз каждые 20 мс.

Initialize D2D материал

ID2D1Factory* d2dFactory = NULL; 
IWICImagingFactory* d2dWICFactory = NULL; 
IWICBitmapDecoder* d2dDecoder = NULL; 
IWICFormatConverter* d2dConverter = NULL; 
ID2D1HwndRenderTarget* d2drender = NULL; 
IWICBitmapFrameDecode* d2dBmpSrc = NULL; 
ID2D1Bitmap* d2dBmp = NULL; 

/* initialize all the good stuff */ 
HRESULT hr = D2D1CreateFactory(D2D1_FACTORY_TYPE_SINGLE_THREADED, 
       __uuidof(ID2D1Factory), NULL, (void**)&d2dFactory);  

D2D1_SIZE_U size = D2D1::SizeU(rc.right - rc.left, rc.bottom - rc.top); 

hr = d2dFactory->CreateHwndRenderTarget(D2D1::RenderTargetProperties(), 
       D2D1::HwndRenderTargetProperties(zgE->getWnd(), size), &d2drender); 

hr = CoCreateInstance(CLSID_WICImagingFactory, NULL, CLSCTX_INPROC_SERVER, 
        __uuidof(IWICImagingFactory), (void**)(&d2dWICFactory)); 

hr = d2dWICFactory->CreateDecoderFromFilename(L"tile_1.png", NULL, GENERIC_READ, 
             WICDecodeMetadataCacheOnLoad, &d2dDecoder); 

hr = d2dWICFactory->CreateFormatConverter(&d2dConverter); 

hr = d2dDecoder->GetFrame(0, &d2dBmpSrc); 

hr = d2dConverter->Initialize(d2dBmpSrc, GUID_WICPixelFormat32bppPBGRA, 
       WICBitmapDitherTypeNone, NULL, 0.f, WICBitmapPaletteTypeMedianCut); 

hr = d2drender->CreateBitmapFromWicBitmap(d2dConverter, NULL, &d2dBmp); 

Чертеж:

/* draw the image */ 
D2D1_RECT_F rect = D2D1::RectF(x, y, x + size.width, y + size.height); 
d2drender->DrawBitmap(d2dBmp, &rect); 

Однако, я не могу заставить его сделать только часть его, позволяет сказать, что 20 от 20 пикселей. Я искал DrawBitmap() и с разным размером rect s, но результат не обрезает изображение.

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

+0

Какой результат у вас на самом деле? – zdd

+0

Только получил его, чтобы он был полностью обработан в 1: 1 или масштабирован или растянут в зависимости от размеров прямоугольника в параметре. Кроме того, попробовал другую перегрузку DrawBitmap() (с двумя исправлениями - у меня нет кода), но ничего. –

+0

где код для разбивки всего растрового изображения? если вы не разделили его, как вы его нарисовали? – zdd

ответ

2

В основном три шага

  1. Создать все растровое изображение из файла
  2. Получить часть всего растрового изображение с помощью вызова CopyFromBitmap
  3. Рисовать растровое изображение, созданное на шаге 2.
+0

Следует упомянуть, что вам нужно создать еще одно растровое изображение, в котором вы копируете часть из большого растрового изображения. Во всяком случае, спасибо, это сработало. –

2

ID2D1RenderTarget::DrawBitmap (http://msdn.microsoft.com/en-us/library/windows/desktop/dd371880(v=vs.85).aspx) принимает до 5 параметров, последний из которых является исходным прямоугольником. Вы только поставляете первые 2 параметра, а по умолчанию для исходного прямоугольника используется весь битмап. Таким образом, решение состоит в том, чтобы предоставить этот параметр D2D1::RectF(0, 0, 20, 20), если вы хотите только рисовать из этой части.