把char*转为C++的BITMAP对象

小·资 2019-06-18 05:37:38
foxit::common::Bitmap bitmap;
bitmap = image_object->CloneBitmap(page);
byte* buffer = (byte*)bitmap.GetBuffer();

BITMAPINFO bmpInfo; //创建位图
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);;
bmpInfo.bmiHeader.biWidth = bitmap.GetWidth();//宽度
bmpInfo.bmiHeader.biHeight = bitmap.GetHeight();//高度
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = bitmap.GetBpp();
bmpInfo.bmiHeader.biCompression = BI_RGB;
//bmpInfo.bmiColors[]= buffer;
hBitmap = CreateDIBSection(_compDC, &bmpInfo, DIB_RGB_COLORS, (void**)out, NULL, 0);
image.Attach(hBitmap);
image.Save("D:\\cunchu1.bmp");





要将别的图片对象转化为Cimage对象,发现可以获取福昕的图片对象里的buffer,上网查了这个是位图的RGB数据,可是不知道怎么使用。又找到了可以使用CreateDIBSection得到BITMAP对象,可是根本不知道怎么初始化bmpInfo.bmiColors[],找了好多帖子也没有。奔溃了要。
...全文
844 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2019-06-19
  • 打赏
  • 举报
回复
小·资 2019-06-19
  • 打赏
  • 举报
回复
问题都解决了,缺损还是大小问题,大小改为( bitmap.GetWidth()+1)*3*bitmap.GetHeight()就可以了,图片是反的我觉得是因为foxit的BITMAP的RGB编码顺序和C++就是反的,我直接在读取前把图片翻转了,顺道一提bitmap是福昕的foxit::common::Bitmap类,结贴了,虽然赵四老师的东西没什么用,还是感谢赵四老师
小·资 2019-06-19
  • 打赏
  • 举报
回复
图片转出来了,重点在RGB数据给到内存的长度,不是buffer本身的长度而是图片的大小,即width*height*3,但是现在出来的图片是反的,而且像素有一块缺损 CImage image; char* buffer = (char*)bitmap.GetBuffer(); HBITMAP hBitmap; char** out=new char*; HDC _compDC = CreateCompatibleDC(AfxGetMainWnd()->GetDC()->m_hDC); BITMAPINFO bmpInfo; //创建位图 bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER) ; bmpInfo.bmiHeader.biWidth = bitmap.GetWidth();//宽度 bmpInfo.bmiHeader.biHeight = bitmap.GetHeight();//高度 bmpInfo.bmiHeader.biPlanes = 1; bmpInfo.bmiHeader.biBitCount = bitmap.GetBpp(); bmpInfo.bmiHeader.biCompression = BI_RGB; hBitmap = CreateDIBSection(_compDC, &bmpInfo, DIB_RGB_COLORS, (void**)out, NULL, 0); int n = _mbslen((unsigned char*)buffer); memcpy(out[0],buffer, bitmap.GetWidth()*3*bitmap.GetHeight()); image.Attach(hBitmap); image.Save("D:\\cunchu1.jpg"); //Bitmap b = BitmapFactory.decodeByteArray(data, 0, data.length);
赵4老师 2019-06-19
  • 打赏
  • 举报
回复
BOOL LoadPngImg(LPCTSTR filename,HBITMAP * hbit) {
    //查找文件是否存在
    if (!FindFile(filename)) return FALSE;
    IImagingFactory* pImageFactory = 0;
    IImage* pImage = 0;
    ImageInfo imageInfo;
    //CoInitializeEx(0, COINIT_MULTITHREADED);
    HBITMAP hBitmap = 0;
    LPBYTE lpByte;
    if (SUCCEEDED(CoCreateInstance(CLSID_ImagingFactory, 0, CLSCTX_INPROC_SERVER, IID_IImagingFactory, (void**)&pImageFactory))) {
        if (SUCCEEDED(pImageFactory->CreateImageFromFile(filename, &pImage))&& SUCCEEDED(pImage->GetImageInfo(&imageInfo))) {
            //HDC bmpDC = CreateCompatibleDC(hdc);
            //LPBYTE lpByte;
            BITMAPINFO *pbinfo ;
            pbinfo = (BITMAPINFO *)calloc(1, sizeof(BITMAPINFO) + 4 * sizeof(INT)) ;
            if(!pbinfo) return FALSE ;
            pbinfo->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);
            pbinfo->bmiHeader.biWidth = imageInfo.Width ;
            pbinfo->bmiHeader.biHeight = imageInfo.Height ;
            pbinfo->bmiHeader.biPlanes = 1;
            pbinfo->bmiHeader.biBitCount = 32;
            pbinfo->bmiHeader.biCompression = BI_ALPHABITFIELDS;
            pbinfo->bmiHeader.biSizeImage = 0 ;
            pbinfo->bmiHeader.biXPelsPerMeter = 11811;
            pbinfo->bmiHeader.biYPelsPerMeter = 11811;
            pbinfo->bmiHeader.biClrUsed = 0;
            pbinfo->bmiHeader.biClrImportant = 0;
            int *pMask = (int*)&(pbinfo->bmiColors[0]) ;
            *pMask++ = 0x00FF0000 ;
            *pMask++ = 0x0000FF00 ;
            *pMask++ = 0x000000FF ;
            *pMask++ = 0xFF000000 ;
            hBitmap = CreateDIBSection(NULL, pbinfo, DIB_RGB_COLORS, (void **)&lpByte, NULL, 0) ;
            free(pbinfo) ;
            if(!hBitmap || !lpByte) return FALSE ;
            RECT rect = {0, 0, imageInfo.Width, imageInfo.Height};
            IBitmapImage *pBitmapImage;
            BitmapData bitmapData;
            bitmapData.Width = imageInfo.Width;
            bitmapData.Height = imageInfo.Height;
            bitmapData.PixelFormat = imageInfo.PixelFormat;
            pBitmapImage = NULL;
            pImageFactory->CreateBitmapFromImage(pImage, imageInfo.Width, imageInfo.Height, PIXFMT_32BPP_ARGB,InterpolationHintDefault, &pBitmapImage);
            pBitmapImage->LockBits(&rect, ImageLockModeRead,PIXFMT_32BPP_ARGB, &bitmapData);
            //transferring the pixels
            memcpy(lpByte, bitmapData.Scan0, imageInfo.Width * imageInfo.Height * 4);
            pBitmapImage->UnlockBits(&bitmapData);
            pBitmapImage->Release();
            pImage->Release();
            // DeleteDC(bmpDC);
        }
        pImageFactory->Release();
    }
    //CoUninitialize();
    //ProcessThePixelsWithAlphaChannel Here
    // vertical flip and ProcessThePixelsWithAlphaChannel here
    for (UINT y=0; y<imageInfo.Height/2; y++) {
        BYTE * pPixel = (BYTE *) lpByte + imageInfo.Width * 4 * y;
        BYTE * pDstPixel = (BYTE*) lpByte + imageInfo.Width * 4 * (imageInfo.Height-y-1);
        for (UINT x=0; x<imageInfo.Width; x++) {
            pPixel[0] = pPixel[0] * pPixel[3] / 255;
            pPixel[1] = pPixel[1] * pPixel[3] / 255;
            pPixel[2] = pPixel[2] * pPixel[3] / 255;
            pDstPixel[0] = pDstPixel[0] * pDstPixel[3] / 255;
            pDstPixel[1] = pDstPixel[1] * pDstPixel[3] / 255;
            pDstPixel[2] = pDstPixel[2] * pDstPixel[3] / 255;
            INT* pOrigin = (INT*)pPixel;
            INT* pDst    = (INT*)pDstPixel;
            INT temp = *pOrigin;
            *pOrigin = *pDst;
            *pDst = temp;
            pPixel += 4;
            pDstPixel += 4;
        }
    }
    *hbit= hBitmap;
    if (!hbit) return FALSE;
    return TRUE;
}
小·资 2019-06-19
  • 打赏
  • 举报
回复
char* buffer = (char*)bitmap.GetBuffer(); CString str = buffer; foxit::common::Bitmap mybit(bitmap.GetWidth(), bitmap.GetWidth(), bitmap.GetFormat(), (foxit::uint8*) buffer, 0); HBITMAP hBitmap; char** out=new char*; HDC _compDC = CreateCompatibleDC(AfxGetMainWnd()->GetDC()->m_hDC); //setbih(iWidth, iHeight); BITMAPINFO bmpInfo; //创建位图 bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER) + 256 * sizeof(RGBQUAD);; bmpInfo.bmiHeader.biWidth = bitmap.GetWidth();//宽度 bmpInfo.bmiHeader.biHeight = bitmap.GetHeight();//高度 bmpInfo.bmiHeader.biPlanes = 1; bmpInfo.bmiHeader.biBitCount = bitmap.GetBpp(); bmpInfo.bmiHeader.biCompression = BI_RGB; //bmpInfo.bmiColors[]= buffer; hBitmap = CreateDIBSection(_compDC, &bmpInfo, DIB_RGB_COLORS, (void**)out, NULL, 0); memcpy(out,buffer,str.GetLength()); image.Attach(hBitmap); image.Save("D:\\cunchu1.bmp");
小·资 2019-06-19
  • 打赏
  • 举报
回复
有人告诉我CreateDIBSection的第四个参数就是像素数据,把char*的像素数据memcpy给第四个输出指针就行,可是我操作了以后失败了
内容概要:本文围绕“非线性流量的数据驱动Koopman模型预测控制研究”展开,提出一种基于数据驱动的Koopman算子理论方法,用于构建非线性系统的线性化状态空间模型,并结合模型预测控制(MPC)实现对复杂非线性系统的高效控制。研究通过引入扩展动态模态分解(EDMD)等观测函数,将非线性动力学映射至高维特征空间,在该空间中实现近似线性化表征,进而融合线性MPC框架进行优化求解。全文系统阐述了Koopman算子的数学基础、隐式线性化机制及在非线性流量控制中的建模流程,并通过Matlab代码完成了算法实现与仿真实验,验证了该方法在处理无精确物理模型、强非线性、时变动态系统中的有效性与鲁棒性,尤其适用于工业流程控制、能源系统调度等实际工程场景。; 适合人群:具备自动控制理论、非线性系统分析基础,熟悉Matlab编程,从事控制工程、系统辨识、智能优化、能源系统建模等方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于难以建立精确数学模型的复杂非线性系统(如流体动力系统、电力电子系统、机器人动力学等)的建模与实时控制;②实现数据驱动下的模型预测控制,提升系统响应速度与控制精度;③为先进控制策略(如MPC)提供一种可行的线性化建模范式,推动现代控制理论与数据科学、机器学习的深度融合。; 阅读建议:建议读者结合提供的Matlab代码深入理解Koopman方法的具体实现过程,重点关注观测函数构造、核函数选择、矩阵逼近、降维处理及MPC控制器设计等关键技术环节,并尝试将其迁移至其他非线性系统中进行复现实验与性能对比,以全面掌握其适用范围与局限性。
内容概要:本文详细介绍了一种基于Simulink的光伏储能单相逆变器并网仿真模型,系统涵盖了光伏阵列、储能单元、DC-AC单相逆变器及并网接口的完整结构,重点实现了储能环节的能量管理与逆变器并网控制策略的建模仿真。通过Simulink平台构建系统模型,验证了逆变器输出电能质量、并网稳定性以及控制系统的动态响应性能,采用SPWM调制、PI闭环控制等关键技术,确保并网电流与电网电压同频同相,满足并网电能质量要求。该模型不仅可用于分布式能源系统的仿真研究,还可作为新能源并网技术的教学与工程实践工具。; 适合人群:电气工程、自动化、新能源科学与工程等相关专业的高校本科生、研究生、科研人员,以及从事光伏发电系统设计、储能控制与并网技术研发的工程技术人员。; 使用场景及目标:①深入理解光伏储能系统中能量转换、存储与并网控制的整体工作原理;②支持课程设计、毕业设计或科研项目中对单相逆变器控制策略(如SPWM、PI调节、锁相技术等)的仿真验证与参数优化;③为后续研究更复杂的控制算法(如MPPT、低电压穿越、谐波抑制等)提供可扩展的仿真基础平台。; 阅读建议:建议结合MATLAB/Simulink环境动手搭建与调试模型,逐步理解各模块(如光伏建模、储能充放电控制、逆变器驱动、锁相环、PI调节器等)的功能与交互关系,重点关注控制系统的设计逻辑与参数整定过程,并可通过修改负载条件或电网参数测试系统鲁棒性,为进一步拓展至三相系统或多机并网场景奠定基础。

65,212

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧