首页 > 其他分享 >BLOB类型二进制数据转换成Bitmap类型数据,并显示成缩略图,类似手机相册的封面

BLOB类型二进制数据转换成Bitmap类型数据,并显示成缩略图,类似手机相册的封面

时间:2024-07-18 12:07:08浏览次数:13  
标签:DemoDuilib pButton HBITMAP 缩略图 bitmap Gdiplus BLOB hBitmap Bitmap

class DemoDuilib : public WindowImplBase, public CButtonUI
{
public:
    DemoDuilib();
    ~DemoDuilib(); 
    void test();
    static std::vector<uint8_t> thumbData;//存储BLOB类型二进制数据
private:
    void PaintStatusImage(HDC hDC) override;//保持纵横比并裁剪
    HBITMAP CreateHBITMAPFromMemory(const std::vector<uint8_t>& data);//BLOB类型二进制数据转换成Bitmap类型数据
)
void test(){
        DemoDuilib* pButton = new DemoDuilib();
        CDuiString strName;
        strName.Format(_T("btn_square_%d"), i + 1);
        pButton->SetName(strName);
        pButton->SetFixedHeight(BUTTONSIZE);//const int BUTTONSIZE = 85;
        pButton->SetFixedWidth(BUTTONSIZE);
        HBITMAP hBitmap = CreateHBITMAPFromMemory(thumbData);
        if (hBitmap)
        {
            pButton->SetNormalImage(hBitmap);
        }
        pButton->SetPadding(CDuiRect(10,0,0,0));
        pButtonLayout->Add(pButton);
}
void DemoDuilib::PaintStatusImage(HDC hDC)
{
    if (m_hNormalBitmap)
    {
        HDC hMemDC = CreateCompatibleDC(hDC);
        HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemDC, m_hNormalBitmap);
        BITMAP bitmap;
        GetObject(m_hNormalBitmap, sizeof(bitmap), &bitmap);
        
        float aspectRatio = static_cast<float>(bitmap.bmWidth) / bitmap.bmHeight;
        int targetWidth = m_rcItem.right - m_rcItem.left;
        int targetHeight = m_rcItem.bottom - m_rcItem.top;
        int newWidth, newHeight;
        if (aspectRatio > 1.0f) {
            newWidth = targetWidth;
            newHeight = static_cast<int>(targetWidth / aspectRatio);
        } else {
            newHeight = targetHeight;
            newWidth = static_cast<int>(targetHeight * aspectRatio);
        }
        int offsetX = (targetWidth - newWidth) / 2;
        int offsetY = (targetHeight - newHeight) / 2;
        StretchBlt(hDC, m_rcItem.left, m_rcItem.top, targetWidth, targetHeight,
                   hMemDC, 0, 0, bitmap.bmWidth, bitmap.bmHeight, SRCCOPY);
        SelectObject(hMemDC, hOldBitmap);
        DeleteDC(hMemDC);
    } else {
        CButtonUI::PaintStatusImage(hDC);
    }
}

HBITMAP DemoDuilib::CreateHBITMAPFromMemory(const std::vector<uint8_t>& data)
{
    HBITMAP hBitmap = NULL;
    Gdiplus::GdiplusStartupInput gdiplusStartupInput;
    ULONG_PTR gdiplusToken;
    Gdiplus::GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);
    IStream* pStream = SHCreateMemStream(data.data(), data.size());
    if (pStream)
    {
        Gdiplus::Bitmap* pBitmap = Gdiplus::Bitmap::FromStream(pStream);
        if (pBitmap)
        {
            pBitmap->GetHBITMAP(Gdiplus::Color(0, 0, 0), &hBitmap);
            delete pBitmap;
        }
        pStream->Release();
    }
    Gdiplus::GdiplusShutdown(gdiplusToken);
    return hBitmap;
}

 

标签:DemoDuilib,pButton,HBITMAP,缩略图,bitmap,Gdiplus,BLOB,hBitmap,Bitmap
From: https://www.cnblogs.com/mengyaoli/p/18309251

相关文章

  • Javascript: Blob, File/FileReader, ArrayBuffer, ReadableStream, Response 转换方
    目录先上图各个ObjectArrayBuffer:Blob:File:FileReader:ReadableStream:Response用法举例ArrayBufferBlob,File,FileReaderReadableStream关于ReadableStream的一点总结Response构造函数Parametersblob()先上图各个ObjectArrayBuffer:1.ArrayBuffer是JavaScript......
  • BlobTool
    BlobTool------内容引用自Cognex帮助文档你可以使用Blob工具来检查图像中的一个区域,并定位由灰度值范围有限且形状通常不可预测的像素组成的特征。检测和分析这些特征(或称为blob)的过程称为blob分析。通过blob分析,你可以获取关于图像中特定特征的存在、数量、位置、形状......
  • C# 图片保存 缩略图保存
    前言项目需要保存缩略图,写了个简单的保存代码。在包控制管理工具中安装Magick.NET-Q16-AnyCPUusingImageMagick;代码根据原图的格式保存缩略图///<summary>///保存缩略图///</summary>///<paramname="originalFilePath">原......
  • 在WPF中使用WriteableBitmap对接工业相机及常用操作
    写作背景写这篇文章主要是因为工业相机(海康、大恒等)提供的.NET开发文档和示例程序都是用WinForm项目来说明举例的,而在WPF项目中对图像的使用和处理与在WinForm项目中有很大不同。在WinForm中用System.Drawing.Bitmap来处理图像,而在WPF中是用System.Windows.Media.Imaging.Writeab......
  • 【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
    问题描述iOS Objective-C应用,连接AzureStorageAccount,根据官网Example代码,在没有关闭StorageAccount的匿名访问时,程序正常运行。但是,只要关闭了匿名访问,上传blob到Container中,就会报错:Publicaccessisnotpermittedonthisstorageaccount  问题解答查看示例......
  • BMP(Bitmap Image File)解码流程:
    BMP(BitmapImageFile)的解码流程主要包括以下几个步骤,这些步骤确保了BMP图像文件能够被正确地读取并显示在屏幕上:1.读取文件头信息目的:确认文件类型和基本信息。内容:BMP文件以特定的文件头标识开始,这包括文件的类型(必须是“BM”,以十六进制表示为0x4D42)、文件大小、保留字(......
  • 高效存储的秘诀:bitmap 数据结构在标签中的应用
    在当今大数据和信息爆炸的时代,如何有效地管理和查询海量的数据成为了企业和开发者面临的重大挑战。其中,标签系统作为数据管理中的一种重要手段,被广泛应用于用户画像、商品分类、内容推荐等多个场景。然而,随着标签数量的急剧增加,传统的数据存储和查询方式已难以满足高效率、低延迟......
  • 慢查询、pipline、发布订阅、 bitmap位图、 hyperloglog、geo、持久化
    【慢查询】1#1我们配置一个时间,如果查询时间超过了我们设置的时间,我们就认为这是一个慢查询2#2慢查询是一个先进先出的队列,固定长度,保存在内存中--->通过设置慢查询,以后超过我们设置时间的命令,就会放在这个队列中3#3后期我们通过查询这个队列,过滤出慢命令--》......
  • JavaScript 的Blob 对象详解
    JavaScript的Blob对象详解:https://blog.csdn.net/qq_41152573/article/details/136225387?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522171870454816800227415776%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=17187045481680......
  • 详谈JavaScript 二进制家族:Blob、File、FileReader、ArrayBuffer、Base64
    详谈JavaScript二进制家族:Blob、File、FileReader、ArrayBuffer、Base64:https://blog.csdn.net/weixin_43025151/article/details/129743443?ops_request_misc=&request_id=&biz_id=102&utm_term=JavaScript%E4%B8%AD%E7%9A%84Blob%E4%BD%A0%E7%9F%A5%E9%81%93%E5%A4%9A%E......