将bmp文件加载到HBITMAP中

寻求

是否可以从包含多个图像的bmp文件中加载图像?例如,我有一个bmp文件,我想将图像从12; 12加载到36; 36。感谢您的回答。

布兰登

我使用以下代码来处理和加载位图。.它非常可移植(除了HBitmap和绘制函数(#ifdef无论如何都是d ..)):

Images.hpp:

#ifndef IMAGES_HPP_INCLUDED
#define IMAGES_HPP_INCLUDED

#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>
#include <stdexcept>
#include <windows.h>

namespace CG
{
    typedef union RGBA
    {
        std::uint32_t Colour;
        struct
        {
            std::uint8_t R, G, B, A;
        };
    } *PRGB;

    class Image
    {
        private:
            RGBA* Pixels;
            std::uint32_t width, height;
            std::uint16_t BitsPerPixel;

        protected:

        public:
            ~Image();

            Image(HWND Window, int X, int Y, int Width, int Height);
    };
}

#endif // IMAGES_HPP_INCLUDED

Images.cpp:

#include "Images.hpp"

namespace CG
{
    Image::~Image()
    {
        delete[] this->Pixels;
    }

    Image::Image(HWND Window, int X, int Y, int Width, int Height)
    {
        HDC DC = GetDC(Window);
        BITMAP Bmp = {0};
        HBITMAP hBmp = reinterpret_cast<HBITMAP>(GetCurrentObject(DC, OBJ_BITMAP));

        if (GetObject(hBmp, sizeof(BITMAP), &Bmp) == 0)
            throw std::runtime_error("BITMAP DC NOT FOUND.");

        RECT area = {X, Y, X + Width, Y + Height};
        GetClientRect(Window, &area);

        HDC MemDC = GetDC(nullptr);
        HDC SDC = CreateCompatibleDC(MemDC);
        HBITMAP hSBmp = CreateCompatibleBitmap(MemDC, width, height);
        DeleteObject(SelectObject(SDC, hSBmp));

        BitBlt(SDC, 0, 0, width, height, DC, X, Y, SRCCOPY);
        this->Pixels = new RGBA[width * height];

        BITMAPINFO Info = {sizeof(BITMAPINFOHEADER), width, height, 1, BitsPerPixel, BI_RGB, Data.size(), 0, 0, 0, 0};
        GetDIBits(SDC, hSBmp, 0, height, this->Pixels, &Info, DIB_RGB_COLORS);

        DeleteDC(SDC);
        DeleteObject(hSBmp);
        ReleaseDC(nullptr, MemDC);
        ReleaseDC(Window, DC);
    }
}

如果要将以上任何内容转换为hBitmap,可以执行以下操作:

HBITMAP Image::ToHBitmap()
{
    void* Memory = this->Pixels;        
    std::size_t size = ((width * BitsPerPixel + 31) / 32) * 4 * height;
    BITMAPINFO Info = {sizeof(BITMAPINFOHEADER), width, height, 1, BitsPerPixel, BI_RGB, size, 0, 0, 0, 0};
    HBITMAP hBmp = CreateDIBSection(nullptr, &Info, DIB_RGB_COLORS, &Memory, nullptr, 0);
    return hBmp;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用Selenium将javascript文件加载到DOM中?

来自分类Dev

将.RData文件加载到Python中

来自分类Dev

将.txt文件加载到textarea Javascript中?

来自分类Dev

如何从本地JSON文件将数据加载到ViewController中

来自分类Dev

将属性从外部文件加载到build.gradle中

来自分类Dev

将本地文件(CSS或JS)加载到所选的网站中

来自分类Dev

将HTML文件加载到PHP变量中?

来自分类Dev

如何将压缩文件加载到BigQuery中

来自分类Dev

C ++:将Hbitmap / BITMAP转换为.bmp文件

来自分类Dev

从XAML加载ResourceDictionary也将文件加载到内存中

来自分类Dev

如何将源文件加载到Haskell(ghci)中?

来自分类Dev

将大RDF文件加载到芝麻中

来自分类Dev

将gif从数据加载到QMovie对象中(无文件)

来自分类Dev

使用sklearn将.csv文件加载到python中

来自分类Dev

Perl:将文件加载到哈希中

来自分类Dev

将外部JSON文件加载到HTML表中

来自分类Dev

将csv文件加载到列表中

来自分类Dev

UWP-将图像加载到文件夹中

来自分类Dev

将.Rdata文件加载到list()中

来自分类Dev

将PNG文件加载到TensorFlow中

来自分类Dev

将图像加载到jar文件中

来自分类Dev

将文件加载到Teradata

来自分类Dev

将.trig文件加载到TDB中?

来自分类Dev

将bmp加载到InkCanvas中时,InkSerializedFormat操作失败

来自分类Dev

将文件中的文本加载到文本框中

来自分类Dev

无法将GCS中的CSV文件加载到bigquery中

来自分类Dev

从文件将数据加载到表中

来自分类Dev

将文件加载到dist文件夹中的问题

来自分类Dev

将文件中的数据加载到 tkinter 小部件中