Answered by:
One problem about ID2D1Bitmap::CopyFromBitmap API

Question
-
I tried to get pixels from D2D1Bitmap1 and I have read this discussion http://social.msdn.microsoft.com/Forums/en/winappswithnativecode/thread/c9426e4c-56a0-48b6-96d1-105e9e9e581e
This is my code.
D2D1_BITMAP_PROPERTIES1 prop = D2D1::BitmapProperties1( D2D1_BITMAP_OPTIONS_CPU_READ | D2D1_BITMAP_OPTIONS_CANNOT_DRAW, D2D1::PixelFormat( DXGI_FORMAT_B8G8R8A8_UNORM, D2D1_ALPHA_MODE_PREMULTIPLIED ) ); D2D1_SIZE_U pixelSize = m_d2dContext->GetPixelSize(); ComPtr<ID2D1Bitmap1> otherBmp; DX::ThrowIfFailed(m_d2dContext->CreateBitmap( pixelSize, nullptr, pixelSize.width * 4, &prop, &otherBmp ) ); D2D1_RECT_U rect = {0, 0, m_sInputTextProp.iBackgroundWidth, m_sInputTextProp.iBackgroundHeight}; D2D1_POINT_2U point = {0, 0}; DX::ThrowIfFailed(otherBmp->CopyFromBitmap(&point, outputbitmap.Get(), &rect)); D2D1_MAP_OPTIONS options = D2D1_MAP_OPTIONS_READ; D2D1_MAPPED_RECT mappedRect; DX::ThrowIfFailed(otherBmp->Map(options, &mappedRect)); memcpy(pPixelData, mappedRect.bits, m_sInputTextProp.iBackgroundWidth * m_sInputTextProp.iBackgroundHeight * 4); otherBmp->Unmap();
This code can run successfully on Intel i5 IVB machine (integrated VGA) and get the correct pixels data.
But I get corrupted pixels data on AMD HD 6850 or NVIDIA 450 GTS.
I tried to use IWICImageEncoder to save it as a bitmap before I call CopyFromBitmap.
And this bitmap is correct on 3 VGA cards.
I don't know it's my code problem or does it have any possibility of VGA vendor's driver issue?
Thanks.
Friday, November 2, 2012 9:25 AM
Answers
-
maybe mappedRect.pitch and pich of pPixelData is incorrected;
use mappedRect.pitch
- Marked as answer by Jesse JiangModerator Friday, November 23, 2012 8:00 AM
Monday, November 12, 2012 12:31 PM -
Hi Albert,
I found it's real different between mappedRect.pitch and m_sInputTextProp.iBackgroundWidthI modified it as
BYTE *pSrcData = mappedRect.bits; BYTE *pTarData = pPixelData; for(int i = 0; i < m_sInputTextProp.iOutputBackgroundHeight; i++) { memcpy(pTarData,pSrcData,m_sInputTextProp.iOutputBackgroundWidth*4); pTarData += m_sInputTextProp.iOutputBackgroundWidth *4; pSrcData += mappedRect.pitch; }
And it's fixed.
Thank you very much.
- Marked as answer by Jesse JiangModerator Friday, November 23, 2012 8:00 AM
Wednesday, November 14, 2012 3:05 AM
All replies
-
maybe mappedRect.pitch and pich of pPixelData is incorrected;
use mappedRect.pitch
- Marked as answer by Jesse JiangModerator Friday, November 23, 2012 8:00 AM
Monday, November 12, 2012 12:31 PM -
Hi Albert,
I found it's real different between mappedRect.pitch and m_sInputTextProp.iBackgroundWidthI modified it as
BYTE *pSrcData = mappedRect.bits; BYTE *pTarData = pPixelData; for(int i = 0; i < m_sInputTextProp.iOutputBackgroundHeight; i++) { memcpy(pTarData,pSrcData,m_sInputTextProp.iOutputBackgroundWidth*4); pTarData += m_sInputTextProp.iOutputBackgroundWidth *4; pSrcData += mappedRect.pitch; }
And it's fixed.
Thank you very much.
- Marked as answer by Jesse JiangModerator Friday, November 23, 2012 8:00 AM
Wednesday, November 14, 2012 3:05 AM