从位图数据取得位图句柄

#include <windows.h>
#include <fstream>
using namespace std;  

void main()
{
    ifstream infile("bm.bmp", ios::in | ios::binary);  

    BITMAPFILEHEADER bmpHeader;
    // 获取文件大小
    infile.seekg(0, ios::end);
    long nfilelen = infile.tellg();
    infile.seekg(0, ios::beg);  

    // 读取文件头
    infile.read((char*)&bmpHeader, sizeof(bmpHeader));
    if (bmpHeader.bfType != 0x4d42)
        return ;  

    // 占用一块内存
    HGLOBAL hDIB = GlobalAlloc(GMEM_FIXED, nfilelen);
    if (hDIB == 0)
        return ;  

    // 把文件写入DIB
    infile.read((char*)hDIB, nfilelen - sizeof(BITMAPFILEHEADER));  

    // 锁定内存, 位图信息指向该内存
    // BITMAPINFO == 位图信息头 + 调色板
    BITMAPINFO &bmpInfo = *(BITMAPINFO*)GlobalLock(hDIB);
    // 位图信息头指向该内存
    // BITMAPINFOHEADER *pInfoHead = (BITMAPINFOHEADER*)hDIB;  

    // 位图信息头大小
    // int nHeadSize = sizeof(BITMAPINFOHEADER);
    // 获取颜色数组
    BYTE *pBmpPixelBuffer=(BYTE *)&bmpInfo + bmpHeader.bfOffBits - sizeof(BITMAPFILEHEADER);  

    HDC hDC = GetDC(NULL);
    HBITMAP hBitmap;
    hBitmap=CreateDIBitmap(hDC,(BITMAPINFOHEADER *)&bmpInfo,
        CBM_INIT,(VOID *)pBmpPixelBuffer,&bmpInfo,DIB_RGB_COLORS);  

    HDC memDC;
    memDC = CreateCompatibleDC(hDC);
    SelectObject(memDC, hBitmap);
    BitBlt(hDC, 0, 0, 500, 500, memDC, 0, 0, SRCCOPY);  

    DeleteDC(memDC);
    GlobalFree(hDIB);
    infile.close();
}  

http://blog.csdn.net/mmc1206x/article/details/8686822

时间: 2024-08-28 02:55:27

从位图数据取得位图句柄的相关文章

太有用了,所以转:Delphi下16进制位图数据转位图

如果我们在Form中拖入一个Image控件,并设置好picture后,Alt+F12就可以看到Form的源代码中已经将图片转成了16进制字符串,如下: object Image1: TImage Left = 536 Top = 24 Width = 105 Height = 105 Picture.Data = { 07544269746D61703E040000424D3E0400000000000036000000280000000700 00002B0000000100180000000

C++读取BMP位图数据的方法

图片文件是有固定格式的,像BMP图片:文件头+位图的颜色数据. 文件头一般在读取的时候是使用下面的代码: BITMAPFILEHEADER fileheader={0}; fread(&fileheader,sizeof(fileheader),1,fp); if(fileheader.bfType!=0x4D42) // 判断是否为BMP图片 { fclose(fp); return ; } BITMAPINFOHEADER head; fread(&head,sizeof(BITMAP

如何将内存中的位图数据绘制在DC上

假如你定义了一个位图类,里面包含位图头,位图信息头,调色板,位图数据.然后你按照位图的格式将位图文件读入你的类中,现在你知道了位图的全部信息了.主要信息包含在位图信息头里面,数据则在位图数据缓冲里面.现在的问题是,在Windows下面如何将一张位图画出来,而且现在是如何从数据缓存里面绘画出位图.  一般情况,我们都是直接绘制在dc里面,而不是绑定到子控件,让子控件自己绘画,比如picture控件之类的,我觉得提供绘制在dc里面的接口更具有广泛性. 现在我知道两种从内存数据绘制彩色位图的2种方法.

位图排序(位图技术应用)

1.  问题描述 给定不大于整数 n 的 k 个互不相等的整数 ( k <n ) , 对这些整数进行排序.本文讨论的内容具体可参见<编程珠玑>(第二版)的第一章. 2.  问题分析 关于排序,已经有多种排序方法了:插入排序,归并排序,快速排序,希尔排序等.每种排序都有不同的用武之地.为什么需要位图排序呢?所有的内部排序(上述所提及)都必须一次性将所有排序元素载入内存.假如有1000,000个整数,每个整数4字节,则意味着,至少需要4000,000B 约为 4MB 的内存空间, 如果仅仅只

python,opencv,8位图转24位图

# -*- coding: utf-8 -*- """ Created on Tue Sep 11 18:50:42 2018 @author: LX """ import cv2 import os def data_eight_twentyfor(filedir,savedir,i): list=os.listdir(filedir) print(len(list)) """ for file in os.lis

图解Winhex解析BMP文件数据实例

一 实例解析 示例图片的属性: 原图: 红线处是文件头结束: 第二个红线处是位图信息头结束: 用windows画图取第(2,2)像素点的颜色:画图是从0开始计数,即第3行3列的像素: 搜索16进制的BC542F: 搜到11个: 搜到的数据都靠后:看样子位图数据是倒过来存放的: 对照上面图: 文件头 十六进制值 描 述 42 4D:BM的ASCII值,在Windows中的BMP文件标识符 76 F4 02 00 76 F4 02h=7795714,是文件的大小 - 错误,应该倒过来看: 02 f4

VC API常用函数简单例子大全[转]

第一个:FindWindow根据窗口类名或窗口标题名来获得窗口的句柄,该函数返回窗口的句柄 函数的定义:HWND WINAPI FindWindow(LPCSTR lpClassName ,LPCSTR lpWindowName); 第一个参数填窗口的类名,第二个填窗口的标题名,其实是不需要同时填两个参数的,也就是说,你只要知道窗口的类名或窗口的标题就可以了,没有的那个就用NULL代替. 比如现在有一个窗口名为"无标题.txt - 记事本"的记事本程序.那么我就可以用上面的函数获得这个

BMP结构详解

位图BITMAPINFOHEADER 与BITMAPFILEHEADER: 先来看BITMAPINFOHEADER,只写几个主要的biSize包含的是这个结构体的大小(包括颜色表)    biWidth和biHeight分别是图片的长宽    biPlanes是目标绘图设备包含的层数,必须设置为1    biBitCount是图像的位数,例如24位,8位等    biXPelsPerMeter, biYPelsPerMeter 是现实世界中每米包含的像素数 设为3780即可    biSizeI

Windows DIB文件操作详解-1.DIB的读入、保存和显示

DIB(设备无关位图)是存储在磁盘上的位图文件,可以从磁盘读到内存中或从内存保存到磁盘上,它的磁盘文件结构是标准化的,在Linux.Unix及Windows上都可以以同样效果显示.位图是最接近硬件的图像格式,Windows显示的核心是位图,它的SDK API专门提供了一组用于操作DIB文件的函数.但是由于这样或那样的原因,高效合理的使用这些DIB API是需要了解不少历史和使用背景的,在这里我抽茧剥丝介绍和演示DIB的使用,相信对你更好的使用DIB文件有帮助,由于DIB函数比较多,这里分为三部分