FromHBITMAP 这个函数会丢失透明信息。

在用 FromHBITMAP 你会发现出来的图是带有黑边的,这是因为这个函数有个 bug,解决的办法是用下列的函数进行转换,大体意思就是自己 memcpy 不要用 FromHBITMAP 函数。

 Bitmap* CreateBitmapFromHBITMAP(IN HBITMAP hBitmap)
    {
        BITMAP bmp = { 0 };
        if ( 0 == GetObject(hBitmap, sizeof(BITMAP), (LPVOID)&bmp) )
        {
            return FALSE;
        }

        BYTE *piexlsSrc = NULL;
        LONG cbSize = bmp.bmWidthBytes * bmp.bmHeight;
        piexlsSrc = new BYTE[cbSize];

        BITMAPINFO bmpInfo = { 0 };
        bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
        bmpInfo.bmiHeader.biWidth = bmp.bmWidth;
        bmpInfo.bmiHeader.biHeight = bmp.bmHeight;
        bmpInfo.bmiHeader.biPlanes = bmp.bmPlanes;
        bmpInfo.bmiHeader.biBitCount = bmp.bmBitsPixel;
        bmpInfo.bmiHeader.biCompression = BI_RGB;

        HDC hdcScreen = CreateDC(L"DISPLAY", NULL, NULL,NULL);
        LONG cbCopied = GetDIBits(hdcScreen, hBitmap, 0,
            bmp.bmHeight, piexlsSrc, &bmpInfo, DIB_RGB_COLORS);
        DeleteDC(hdcScreen);
        if ( 0 == cbCopied )
        {
            delete [] piexlsSrc;
            return FALSE;
        }

        Bitmap *pBitmap = new Bitmap(bmp.bmWidth, bmp.bmHeight, PixelFormat32bppPARGB);

        BitmapData bitmapData;
        Rect rect(0, 0, bmp.bmWidth, bmp.bmHeight);
        if ( Ok != pBitmap->LockBits(&rect, ImageLockModeRead,
            PixelFormat32bppPARGB, &bitmapData) )
        {
            SAFE_DELETE(pBitmap);
            return NULL;
        }

        BYTE *pixelsDest = (BYTE*)bitmapData.Scan0;
        int nLinesize = bmp.bmWidth * sizeof(UINT);
        int nHeight = bmp.bmHeight;

        for ( int y = 0; y < nHeight; y++ )
        {
            memcpy_s( (pixelsDest + y * nLinesize), nLinesize,
                (piexlsSrc + (nHeight - y - 1) * nLinesize), nLinesize);
        }

        if ( Ok != pBitmap->UnlockBits(&bitmapData) )
        {
            delete pBitmap;
        }

        delete [] piexlsSrc;
        return pBitmap;
    }

  

参考信息:http://blog.sina.com.cn/s/blog_5f8817250100g1dj.html

     https://groups.google.com/forum/#!topic/microsoft.public.win32.programmer.gdi/stjG06_EPfM 

时间: 2024-07-31 04:30:19

FromHBITMAP 这个函数会丢失透明信息。的相关文章

使用gethostname()函数和gethostbyname()函数获取主机相关信息

from http://ty1992.blog.51cto.com/7098269/1685880 gethostname() : 返回本地主机的标准主机名. 原型如下: #include <unistd.h> int gethostname(char *name, size_t len); 参数说明: 这个函数需要两个参数: 接收缓冲区name,其长度必须为len字节或是更长,存获得的主机名. 接收缓冲区name的最大长度 返回值: 如果函数成功,则返回0.如果发生错误则返回-1.错误号存放

php的内置函数array_values()重置数组信息,数组K值有0开始重新排列

<?php /*php的内置函数array_values()重置数组信息,数据K值有0开始重新排列*/ $a=array("a"=>"Cat","b"=>"Dog","c"=>"Horse"); print_r(array_values($a)); // 输出: // Array ( [0] => Cat [1] => Dog [2] => Ho

使用gethostnam()函数和gethostbyname()函数获取主机相关信息

gethostname() : 返回本地主机的标准主机名. 原型如下: #include <unistd.h> int gethostname(char *name, size_t len); 参数说明: 这个函数需要两个参数: 接收缓冲区name,其长度必须为len字节或是更长,存获得的主机名. 接收缓冲区name的最大长度 返回值: 如果函数成功,则返回0.如果发生错误则返回-1.错误号存放在外部变量errno中. gethostbyname()函数说明--用域名或主机名获取IP地址  

uname函数获取当前主机信息

使用uname可以获取当前系统的一些信息,主要定义和参数定义如下:(图片来字Linux C丛书) 使用此函数获取主机信息可以这样: 1 #include<stdio.h> 2 #include<stdlib.h> 3 #include<sys/types.h> 4 #include<sys/socket.h> 5 #include<unistd.h> 6 #include<netinet/in.h> 7 #include<arp

视图函数获取请求头信息

视图函数获取相关信息请求头信息 Django 的request 中封装的了所有的信息,之前我们只是使用了POST,GET的方法来获取数据 查看request类 def index(request): print(type(request)) return HttpResponse('ko') #输出 <class 'django.core.handlers.wsgi.WSGIRequest'> 导入这个类看看有什么方法 def index (request): from django.core

什么是函数式编程(副作用、纯函数、引用透明)

副作用的概念:一个带有副作用的函数不仅只是简单的返回一个值,还干了一些其他的事情,比如: 修改一个变量 直接修改数据结构 设置一个对象的成员 抛出一个异常或以一个错误终止 打印到终端或读取用户的输入 读取或写入一个文件 在屏幕上绘画 因此我们对于函数式程序的判定边界就在于:函数的副作用. 于是--当函数没有副作用,那么我们就说这个函数符合函数式编程(FP):再给出纯函数这个概念用来定义一个函数没有副作用,我们可以说纯函数构成的程序风格就是函数式的! buyCoffee的例子(p3):函数只不过是

虚函数练习:交通工具信息

Problem E: 交通工具信息 Description 有一个交通工具类vehicle.将它为 基类派生的有派生小车类car,卡车类truck和轮船类boat.定义这些类,并使其可以显示其各类交通工具的具体信息. 他们包括的信息,有例如以下几种: 1.名字    -----与输入的名字相符合 2.时速(km/h)    -----最高时速 3.耗油量(L/100km)    -----在经济时速下測得耗油量 小车类: 250km/h 14.8 L/100km 卡车类: 140km/h 18L

python 获取当前调用函数名等log信息

import sys funcName = sys._getframe().f_back.f_code.co_name #获取调用函数名 lineNumber = sys._getframe().f_back.f_lineno #获取行号 print sys._getframe().f_code.co_name # 获取当前函数名 import inspect def get_current_function_name(): return inspect.stack()[1][3] class

php curl函数获取远程主机的信息

php程序员开发程序过程中,经常需要调用其他的接口.php为我们提供了一系列函数.curl系列函数.下面就这一些列函数的用法加以说明,以备自己和他人查阅. demo.php <?php function curl_get($url,$headerArr='',$cookie=''){ $ch = curl_init($url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE); curl_setopt($ch, CURLOPT_HEADER, fal