4614|3

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于CreateDIBSection方法,我一次执行成功后,第二次执行失败了 [复制链接]

在使用CreateDIBSection后我按msdn上说明的deleteobject由CreateDIBSection创建的HBITMAP对象,然后再一次执行该方法,再执行到CreateDIBSection时,程序退出,没有任何异常表现,有谁碰到过吗?

最新回复

我也是同样的问题,createdibsection创建失败,在线等。。。。  详情 回复 发表于 2010-4-15 15:31
点赞 关注

回复
举报

68

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
把代码贴出来看看.
正确顺序是这样的:
1.Call the CreateDIBSection function.
2.Call the SelectObject function to select the DIBSection into the device context.
...
3.Select the DIBSection again
4.Call DeleteObject to delete the DIBSection when finished.

 
 

回复

59

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
目前就是按这种流程来走,一下是代码:
HRESULT hr;

                if(m_pImagingFactory==NULL){
                        return;
                }

                IImage* pImage=NULL;

                CDC *pPicDC=NULL;
                CDC rotatedDC,memDC;
               
        HBITMAP oldMemBitMap,oldRotateBitMap;

                try{
                       
                        CString pFileFullName=m_vfileList.at(m_iPicIndex);
                        hr=m_pImagingFactory->CreateImageFromFile(pFileFullName,&pImage);

                        if(FAILED(hr)){
                                goto finish;
                        }

                        RECT rectDraw;

                        GetClientRect(&rectDraw);

                        ImageInfo imageInfo;
                        pImage->GetImageInfo(&imageInfo);
                       
                        RECT rectMem={0,0,imageInfo.Width,imageInfo.Height};
                        pPicDC =GetDC();               
                        memDC.CreateCompatibleDC(pPicDC);                       

                        BITMAPINFO memBmi;
                        //memset(&memBmi, 0, sizeof(BITMAPINFO));

                        memBmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
                        memBmi.bmiHeader.biWidth = imageInfo.Width;
                        memBmi.bmiHeader.biHeight = imageInfo.Height;
                        memBmi.bmiHeader.biPlanes = 1;
                        memBmi.bmiHeader.biBitCount = 24;
                        memBmi.bmiHeader.biCompression = BI_RGB;
                        if ( m_hBitmapMem == NULL)
                        {
                                m_hBitmapMem =CreateDIBSection(memDC.GetSafeHdc(), &memBmi, DIB_RGB_COLORS, (void **)&m_lpMemData, NULL, 0);
                        }
                        oldMemBitMap = (HBITMAP)memDC.SelectObject(m_hBitmapMem);
      
                        pImage->Draw(memDC,&rectMem,NULL);

                        pImage->Release();
                        pImage=NULL;
           
                        RECT rectRotated;//旋转后rect
                                   
                        rotatedDC.CreateCompatibleDC(pPicDC);               
            
                        Invalidate();
                        UpdateWindow();

                        BITMAPINFO rotatedBmi;
                        //memset(&rotatedBmi, 0, sizeof(BITMAPINFO));
                        rotatedBmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
                        rotatedBmi.bmiHeader.biWidth = imageInfo.Height;
                        rotatedBmi.bmiHeader.biHeight = imageInfo.Width;
                        rotatedBmi.bmiHeader.biPlanes = 1;
                        rotatedBmi.bmiHeader.biBitCount = 24;
                        rotatedBmi.bmiHeader.biCompression = BI_RGB;

                        //旋转
                        switch(m_iAngle){
                        case 90:{//90度旋转                       

                                rectRotated.left=0;
                                rectRotated.top=0;
                                rectRotated.right=imageInfo.Height;
                                rectRotated.bottom=imageInfo.Width;
                       
                                m_hBitmapRotate = CreateDIBSection(rotatedDC.GetSafeHdc(), &rotatedBmi, DIB_RGB_COLORS, (void **)&m_lpDstData, NULL, 0);
                                //oldRotateBitMap=(HBITMAP)rotatedDC.SelectObject(m_hBitmapRotate);

                                int memStride = WIDTHBYTES(imageInfo.Width*memBmi.bmiHeader.biBitCount);
                                int rotateStride = WIDTHBYTES(imageInfo.Height*rotatedBmi.bmiHeader.biBitCount);
   
                                int index;
                                int index2;

                                for(int i=0;i<(int)imageInfo.Height;i++){
                                        for (int j=0;j<(int)imageInfo.Width;j++)
                                        {
                                                index = i*memStride+j*3;
                                                index2= ((int)imageInfo.Width-j)*rotateStride+i*3;

                                                BYTE R=0,B=0,G=0;

                                                R=m_lpMemData[index];
                                                B=m_lpMemData[index+1];
                                                G=m_lpMemData[index+2];

                                                m_lpDstData[index2] = R;
                                                m_lpDstData[index2+1]= B;
                                                m_lpDstData[index2+2]= G;
                                        }
                                }
                                m_iAngle+=90;
                                oldRotateBitMap=(HBITMAP)rotatedDC.SelectObject(m_hBitmapRotate);

                                break;
                                 }
                        case 180:{//180度旋转
                                //rectRotated.left=0;
                                //rectRotated.top=0;
                                //rectRotated.right=imageInfo.Width;
                                //rectRotated.bottom=imageInfo.Height;

                                //BITMAPINFO rotatedBmi;
                                ////memset(&rotatedBmi, 0, sizeof(BITMAPINFO));

                                //rotatedBmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
                                //rotatedBmi.bmiHeader.biWidth = imageInfo.Width;
                                //rotatedBmi.bmiHeader.biHeight = imageInfo.Height;
                                //rotatedBmi.bmiHeader.biPlanes = 1;
                                //rotatedBmi.bmiHeader.biBitCount = 24;
                                //rotatedBmi.bmiHeader.biCompression = BI_RGB;

                                //m_hBitmapRotate = ::CreateDIBSection(rotatedDC.GetSafeHdc(), &rotatedBmi, DIB_RGB_COLORS, (void **)&m_lpDstData, NULL, 0);
                                //oldRotateBitMap=(HBITMAP)rotatedDC.SelectObject(m_hBitmapRotate);

                                //int memStride = WIDTHBYTES(imageInfo.Width*memBmi.bmiHeader.biBitCount);
                                //int rotateStride = WIDTHBYTES(imageInfo.Width*rotatedBmi.bmiHeader.biBitCount);
                                //int index;
                                //int index2;

                                //for(int i=0;i<(int)imageInfo.Height;i++){
                                //        for (int j=0;j<(int)imageInfo.Width;j++)
                                //        {
                                //                index = i*memStride+j*3;
                                //                index2= (imageInfo.Height-i)*rotateStride+(imageInfo.Width-j)*3;

                                //                m_lpDstData[index2] = m_lpMemData[index];
                                //                m_lpDstData[index2+1]= m_lpMemData[index+1];
                                //                m_lpDstData[index2+2]= m_lpMemData[index+2];
                                //        }
                                //}
                                //m_iAngle+=90;

                                break;
                                         }
                        case 270:{//180度旋转

                                m_iAngle+=90;

                                break;
                                         }
                        case 360:{//180度旋转

                                m_iAngle=90;
                                break;
                                         }
                        }
                        //居中
                        if(rectDraw.bottom>rectRotated.bottom){               
                                rectDraw.top=rectDraw.top+(rectDraw.bottom-rectDraw.top-rectRotated.bottom)/2;
                                rectDraw.bottom = rectDraw.top+rectRotated.bottom;
                        }
                        if(rectDraw.right>rectRotated.right){
                                rectDraw.left = rectDraw.left+(rectDraw.right-rectDraw.left-rectRotated.right)/2;
                                rectDraw.right=rectDraw.left+rectRotated.right;
                        }   

                        //StretchDIBits(pPicDC->GetSafeHdc(),rectDraw.left,rectDraw.top,(rectDraw.right-rectDraw.left),(rectDraw.bottom-rectDraw.top),0,0,rectRotated.right,rectRotated.bottom,m_lpDstData, &rotatedBmi,DIB_RGB_COLORS,SRCCOPY);
                        pPicDC->StretchBlt(rectDraw.left,rectDraw.top,(rectDraw.right-rectDraw.left),(rectDraw.bottom-rectDraw.top),&rotatedDC,0,0,rectRotated.right,rectRotated.bottom,SRCCOPY);
                }
                catch(...){
            printf("sdf");
                        goto finish;
                }
finish:

                memDC.SelectObject(oldMemBitMap);
                rotatedDC.SelectObject(oldRotateBitMap);               

                DeleteObject(m_hBitmapMem);
                m_hBitmapMem = NULL;
                DeleteObject(m_hBitmapRotate);

                rotatedDC.DeleteDC();
                memDC.DeleteDC();                               

                if(pPicDC!=NULL){
                        ReleaseDC(pPicDC);
                }


                if(pImage!=NULL){
                        pImage->Release();
                        pImage=NULL;
                }
                if(m_lpDstData!=NULL){
                        //free(lpDstData);
                        m_lpDstData=NULL;
                }
                if(m_lpMemData!=NULL){
                        //free(lpDstData);
                        m_lpMemData=NULL;
                }
        }
 
 
 

回复

66

帖子

0

TA的资源

一粒金砂(初级)

4
 
我也是同样的问题,createdibsection创建失败,在线等。。。。
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表