animada 2014-12-13 15:15 采纳率: 100%
浏览 3064
已采纳

C++ 处理图片像素时无法读取内存

//bmps 中装的是CImage
for(int i = 0; i < bmps[nIndex].GetHeight(); i++){
for(int j = 0; j < bmps[nIndex].GetWidth();j++){
BYTE * tp1=(BYTE*)bmps[nIndex].GetPixelAddress(i,j);
BYTE * tp2=(BYTE*)bmps[nIndex+1].GetPixelAddress(i,j);
BYTE * tpOut=(BYTE*)bitmap.GetPixelAddress(i,j);
_asm{
emms
mov eax,fadetA

movupd xmm3,[eax]

mov ebx,fadetB
movupd xmm4,[ebx]

            mov ecx,tp1             
            movupd xmm5,[ecx]//这里tp1无法读取内存
            mov edx,tp2
            movupd xmm6,[edx]

            pxor xmm7,xmm7
            punpcklbw   xmm5,xmm7       
            punpcklbw   xmm6,xmm7
            punpcklbw   xmm3,xmm7       
            punpcklbw   xmm4,xmm7

            pmullw      xmm5,xmm3
            pmullw      xmm6,xmm4
            psrlw       xmm5,8  
            psrlw       xmm6,8  
            paddw       xmm5,xmm6   

            packuswb    xmm5,xmm7               

            mov edi,tpOut
            movsd [edi],xmm5                

            EMMS;           
            }
        }
    }
    delete []fadetA;
    delete []fadetB;
    //tmp = bitmap;
    //CDC* pDC;
    //pDC = GetWindowDC();  
    //bitmap.Draw(pDC->m_hDC,0,0);  
    Ondraw();
}
  • 写回答

3条回答

  • dvlinker C/C++领域优质创作者 2014-12-14 02:44
    关注

    给你一段代码参考一下:
    CImage* CCatchScreenDlg::LoadCImage( UINT nID, LPCTSTR lpszType, HINSTANCE hInstance )
    {
    CImage* pImage = NULL;

    hInstance = ( NULL == hInstance ) ? ::AfxGetResourceHandle() : hInstance;
    
    if( RT_BITMAP == lpszType )
    {
        pImage = new CImage();
        pImage->LoadFromResource( hInstance, nID );
        if ( !pImage->IsNull() )
        {
            return pImage;
        }
        else
        {
            WriteScreenCatchLog( _T("[CCatchScreenDlg::LoadCImage]CImage::LoadFromResource失败") );
    
            delete pImage;
            pImage = NULL;
            return NULL;
        }
    }   
    
    CString strLog;
    HRSRC hRsrc = ::FindResource( hInstance, MAKEINTRESOURCE(nID), lpszType ); 
    ASSERT( hRsrc != NULL );
    if ( NULL == hRsrc ) 
    {
        WriteScreenCatchLog( _T("[CCatchScreenDlg::LoadCImage]::FindResource失败") );
        return NULL;
    }
    
    DWORD dwSize = ::SizeofResource( hInstance, hRsrc);
    LPBYTE lpRsrc = (LPBYTE)::LoadResource( hInstance, hRsrc);
    ASSERT( lpRsrc != NULL );
    if ( NULL == hRsrc ) 
    {
        WriteScreenCatchLog( _T("[CCatchScreenDlg::LoadCImage]::LoadResource失败") );
        return NULL;
    }
    
    HGLOBAL hMem = ::GlobalAlloc( GMEM_FIXED, dwSize );
    if ( NULL == hMem ) 
    {
        WriteScreenCatchLog( _T("[CCatchScreenDlg::LoadCImage]::GlobalAlloc失败") );
    
        ::FreeResource( lpRsrc );
        return NULL;
    }
    
    LPBYTE pMem = (LPBYTE)::GlobalLock( hMem );
    if ( NULL == pMem ) 
    {
        WriteScreenCatchLog( _T("[CCatchScreenDlg::LoadCImage]::GlobalLock失败") );
    
        ::GlobalUnlock( hMem );
        ::GlobalFree( hMem );
        ::FreeResource( lpRsrc );
        return NULL;
    }
    
    memcpy( pMem, lpRsrc, dwSize );
    IStream * pStream = NULL;
    HRESULT hr = ::CreateStreamOnHGlobal( hMem, FALSE, &pStream );
    if ( pStream != NULL && hr == S_OK ) 
    {
        pImage = new CImage();
        HRESULT hrs = pImage->Load( pStream );
    
        pStream->Release();
    
        //释放
        ::GlobalUnlock( hMem );
        ::GlobalFree( hMem );
        ::FreeResource( lpRsrc );
    
        if ( hrs == S_OK )
        {
            if ( pImage->GetBPP() == 32 )
            {
                for(int i = 0; i < pImage->GetWidth(); i++)   
                {   
                    for(int j = 0; j < pImage->GetHeight(); j++)   
                    {   
                        unsigned char* pucColor = reinterpret_cast<unsigned char *>(pImage->GetPixelAddress(i , j));   
                        pucColor[0] = pucColor[0] * pucColor[3] / 255;   
                        pucColor[1] = pucColor[1] * pucColor[3] / 255;   
                        pucColor[2] = pucColor[2] * pucColor[3] / 255;   
                    }   
                }
            }
    
            return pImage;
        }
        else
        {
            delete pImage;
            pImage = NULL;
            return NULL;
        }
    }
    else
    {
        WriteScreenCatchLog( _T("[CCatchScreenDlg::LoadCImage]::CreateStreamOnHGlobal失败") );
    
        ::GlobalUnlock( hMem );
        ::GlobalFree( hMem );
        ::FreeResource( lpRsrc );
        return NULL;
    }
    

    }

    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 C++使用Gunplot
  • ¥15 这个电路是如何实现路灯控制器的,原理是什么,怎么求解灯亮起后熄灭的时间如图?
  • ¥15 matlab数字图像处理频率域滤波
  • ¥15 在abaqus做了二维正交切削模型,给刀具添加了超声振动条件后输出切削力为什么比普通切削增大这么多
  • ¥15 ELGamal和paillier计算效率谁快?
  • ¥15 file converter 转换格式失败 报错 Error marking filters as finished,如何解决?
  • ¥15 Arcgis相交分析无法绘制一个或多个图形
  • ¥15 关于#r语言#的问题:差异分析前数据准备,报错Error in data[, sampleName1] : subscript out of bounds请问怎么解决呀以下是全部代码:
  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)