跳到内容
  • 福昕首页
  • 开发中心
  • SDK文档资料
  • 福昕首页
  • 开发中心
  • SDK文档资料
申请试用
  • 企业自动化
    • Compressor
  • 福昕CloudAPI
  • 福昕PDF SDK 软件开发工具包
    • 福昕PDF SDK(ActiveX)
    • 福昕PDF SDK(桌面/服务器)
    • 福昕PDF SDK(Plug-in)
    • 福昕 PDF SDK(安卓)
    • 福昕PDF SDK(iOS)
    • 福昕PDF SDK(Web)
  • 福昕管理控制台
    • 公有云
    • 私有云
    • 通用情况
  • 福昕阅读器
    • RMS插件
  • 福昕高级编辑器
    • AI助手
    • Mac版本
      • 常规问题
    • Windows版本
      • ECM集成
      • 互联PDF
      • 企业管理指南
      • 保护
      • 内容编辑
      • 创建PDF
      • 压缩
      • 图章
      • 安装与卸载
      • 常见问题
      • 打印
      • 注释/评论
      • 福昕插件
      • 翻译助手
      • 翻译助手教程
      • 试用与激活
      • 转换
      • 页面管理
    • 教育用户
      • 论文查重
      • 论文畅
      • 操作指南
    • 网页版
      • Foxit eSign
      • 电子签章
    • 订阅
    • 资源
  • 福昕高级编辑器Linux版本
  • 福船图纸管理系统
  • 福昕PDF SDK 软件开发工具包 | 福昕PDF SDK 软件开发工具包 > 福昕PDF SDK(桌面/服务器)
  • 标签:
  • Bitmap,HBITMAP

Bitmap类型 怎么转换为windwos的HBITMAP(C++)

  • 福昕知识库
  • 2025-12-22

HBITMAP是 Windows GDI(图形设备接口)中的位图句柄(Handle to a Bitmap),在使用C++版本Foxit PDF SDK开发PDF显示预览的图形界面时,经常会用到。

以下是福昕SDK的 C++ 版本的Bitmap类型,转成HBITMAP的示例代码

#include <windows.h>
#include <stdexcept>
#include <cstdint>
#include <algorithm>  

HBITMAP BitmapToHBITMAP( Bitmap& bitmap) {

    if (bitmap.GetWidth() <= 0 || bitmap.GetHeight() <= 0) {
        throw std::invalid_argument("Invalid bitmap width or height");
    }
    int bpp = bitmap.GetBpp();
    int bmp_w = bitmap.GetWidth();
    int bmp_h = bitmap.GetHeight();
    if (bpp != 8 && bpp != 24 && bpp != 32) {
        throw std::invalid_argument("Unsupported BPP: only 8, 24, 32 are allowed");
    }

    const uint8_t* bmpBuffer = bitmap.GetBuffer();
    if (!bmpBuffer) {
        throw std::runtime_error("Bitmap buffer is null");
    }

    BITMAPINFO bmi;
    FillBitmapInfo(bmi, bmp_w, bmp_h, bpp);

    // 获取每个像素的通道数
    int channels = 0;
    if (bpp == 8) {
        channels = 1;
    }
    else if (bpp == 24) {
        channels = 3;
    }
    else if (bpp == 32) {
        channels = 4;
    }
    int rowValidBytes = bmp_w * channels; 

    BYTE* pDibBits = nullptr;
    HBITMAP hBitmap = CreateDIBSection(
        nullptr,           
        &bmi,                 
        DIB_RGB_COLORS,        
        reinterpret_cast<void**>(&pDibBits), 
        nullptr,               
        0                      
    );

    if (!hBitmap || !pDibBits) {
        throw std::runtime_error("Failed to create DIBSection");
    }

    const BYTE* pSrc = reinterpret_cast<const BYTE*>(bmpBuffer);
    for (int row = 0; row < bmp_h; row++) {
        pSrc = reinterpret_cast<const BYTE*>(bmpBuffer) + row * bitmap.GetPitch();
        BYTE* pDst = &pDibBits[row * rowValidBytes];

        // 复制有效像素数据
        memcpy(pDst, pSrc, rowValidBytes);
        if (bpp == 24) {
            for (int col = 0; col < bmp_w; col++) {
                std::swap(pDst[col * 3 + 0], pDst[col * 3 + 2]);
            }
        }
        else if (bpp == 32) {
            for (int col = 0; col < bmp_w; col++) {
                std::swap(pDst[col * 4 + 0], pDst[col * 4 + 2]);
            }
        }
    }
return hBitmap;
}

相关内容

如何使用命令行安装EXE的安装包

如何使用格式刷

如何实现批量文档循环打印

如何将水印置于文字下面

如何将电脑系统登录用户名设置为水印

如何对文档局部内容打马赛克

AC超级管理员如何给自己分配产品授权

在制作表单时表单域没有显示高亮该如何解决

如何在创建文件包时在封面页生成目录

如何一键整合多人批注信息

推荐内容

如何使用命令行安装EXE的安装包

如何使用格式刷

如何实现批量文档循环打印

如何将水印置于文字下面

如何将电脑系统登录用户名设置为水印

如何对文档局部内容打马赛克

AC超级管理员如何给自己分配产品授权

在制作表单时表单域没有显示高亮该如何解决

如何在创建文件包时在封面页生成目录

如何一键整合多人批注信息

产品
  • 应用行业
  • 白皮书
开发支持
  • 开发中心
  • SDK文档资料

销售咨询:010-50951668

客服电话:0591-38509808

销售咨询
微信公众号

©2025 福建福昕软件开发股份有限公司 版权所有

隐私策略