Поскольку 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, но результат не обрезает изображение.
Есть ли способ сделать это , кроме слоев, так как я не хочу накладывать изображение на каждый кадр?
Какой результат у вас на самом деле? – zdd
Только получил его, чтобы он был полностью обработан в 1: 1 или масштабирован или растянут в зависимости от размеров прямоугольника в параметре. Кроме того, попробовал другую перегрузку DrawBitmap() (с двумя исправлениями - у меня нет кода), но ничего. –
где код для разбивки всего растрового изображения? если вы не разделили его, как вы его нарисовали? – zdd