标签: hbitmap

除了使用 P/Invoke 之外,如何在 hBitmap 上调用 DeleteObject()?

我正在处理类似这样的代码(从这里开始

using (var bmp = new System.Drawing.Bitmap(1000, 1000)) 
{
    IntPtr hBitmap = bmp.GetHbitmap(); 
    var source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap(
        hBitmap, IntPtr.Zero, Int32Rect.Empty,
        System.Windows.Media.Imaging.BitmapSizeOptions.FromEmptyOptions());
}
Run Code Online (Sandbox Code Playgroud)

和MSDN说,每当我打电话Bitmap.GetHbitmap()我要叫DeleteObject()hBitmap释放非托管资源。

我看到的所有答案和 MSDN 都说我必须 P/InvokeDeleteObject()函数。这看起来有点疯狂,因为我获得了hBitmap没有 P/Invoke 的,现在我突然需要使用 P/Invoke 来正确摆脱它。

除了 P/Invoke 之外确实没有其他方法可以DeleteObject()调用 myhBitmap吗?

.net c# pinvoke bitmap hbitmap

5
推荐指数
1
解决办法
733
查看次数

从HBITMAP获取字节

如果给出HBITMAP指针,我的应用程序是控制台应用程序,如何从hbitmap获取图像字节.我尝试使用GetDIBits,它需要像HDC这样的参数,这是我无法得到的.

编辑:我从文件加载位图:

HBITMAP bm = 0; 
BITMAP Bitmap;
bm = (HBITMAP)LoadImage (0, TEXT("C:\\img1.bmp"), IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE);
Run Code Online (Sandbox Code Playgroud)

我将HBITMAP传递给函数,并希望得到另一个处理过的图像的HBITMAP:

HBITMAP out1 = func(bm);
Run Code Online (Sandbox Code Playgroud)

其中func是:

HBITMAP func(HBITMAP im);
Run Code Online (Sandbox Code Playgroud)

问题是如何从HBITMAP获取图像字节.

winapi hbitmap

4
推荐指数
2
解决办法
2万
查看次数

在C#中使用原生HBitmap,同时保留alpha通道/透明度

假设我从本机Windows函数中获取HBITMAP对象/句柄.我可以使用Bitmap.FromHbitmap(nativeHBitmap)将其转换为托管位图,但如果原生图像具有透明度信息(alpha通道),则此转换会丢失它.

有关此问题的Stack Overflow有几个问题.使用来自这个问题的第一个答案的信息(如何使用GDI +绘制ARGB位图?),我编写了一段我尝试过的代码并且它有效.

它基本上使用GetObjectBITMAP结构获取本机HBitmap宽度,高度和指向像素数据位置的指针,然后调用托管Bitmap构造函数:

Bitmap managedBitmap = new Bitmap(bitmapStruct.bmWidth, bitmapStruct.bmHeight,
    bitmapStruct.bmWidth * 4, PixelFormat.Format32bppArgb, bitmapStruct.bmBits);
Run Code Online (Sandbox Code Playgroud)

据我所知(请纠正我,如果我错了),这不会将实际像素数据从原生HBitmap复制到托管位图,它只是将托管位图指向本机HBitmap的像素数据.

我不会在另一个图形(DC)或另一个位图上绘制位图,以避免不必要的内存复制,尤其是对于大位图.

我可以简单地将此位图分配给PictureBox控件或Form BackgroundImage属性.它工作正常,使用透明度正确显示位图.

当我不再使用位图时,我确保BackgroundImage属性不再指向位图,并且我同时配置了托管位图和本机HBitmap.

问题:你能告诉我这个推理和代码是否正确.我希望我不会得到一些意想不到的行为或错误.我希望我能正确释放所有内存和对象.

    private void Example()
    {
        IntPtr nativeHBitmap = IntPtr.Zero;

        /* Get the native HBitmap object from a Windows function here */

        // Create the BITMAP structure and get info from our nativeHBitmap
        NativeMethods.BITMAP bitmapStruct = new NativeMethods.BITMAP();
        NativeMethods.GetObjectBitmap(nativeHBitmap, Marshal.SizeOf(bitmapStruct), ref bitmapStruct);

        // Create the managed bitmap using the pointer to …
Run Code Online (Sandbox Code Playgroud)

c# gdi bitmap hbitmap alpha-transparency

3
推荐指数
1
解决办法
6018
查看次数

将HBITMAP绘制到分层窗口上.怎么了?

大家好,祝大家好

我的最终目标是在屏幕上绘制一个包含alpha的PNG文件 - 这意味着不要进入自己的窗口,而只是桌面上的某个地方.将PNG加载到HBITMAP中的部分现在可以正常工作(以不同的方式进行测试),但我无法绘制它,包括alpha.

据我所知,最好的方法是使用alyered窗户.所以我花了很多时间来重做几个例子和小教程.

下面的代码编译没有问题,并且没有提示任何消息(这意味着永远不会调用showError("#")函数).

然而屏幕上看不到任何东西:/

对不起,它太长了...希望有人愿意至少快点看看它...

LRESULT CALLBACK WndProc(HWND hWindow, UINT msg, WPARAM wParam, LPARAM lParam);


int main(HINSTANCE hInstance)
{


    WNDCLASSEX WndClass;
    char sClassName[]  = "mainClass";
    WndClass.cbSize     = sizeof(WNDCLASSEX);
    WndClass.style      = NULL;
    WndClass.lpfnWndProc   = WndProc;//WndProc;
    WndClass.cbClsExtra = 0;
    WndClass.cbWndExtra = 0;
    WndClass.hInstance  = hInstance;
    WndClass.hIcon      = NULL;
    WndClass.hCursor    = LoadCursor(NULL, IDC_ARROW);
    WndClass.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    WndClass.lpszMenuName  = NULL;
    WndClass.lpszClassName = sClassName;
    WndClass.hIconSm    = LoadIcon(NULL, IDI_APPLICATION);
    if (RegisterClassEx(&WndClass) == 0) showError("-1");





    HWND screen = CreateWindowEx(WS_EX_LAYERED,//WS_EX_LEFT
        "mainClass",
        "UpdateLayeredWind", …
Run Code Online (Sandbox Code Playgroud)

c++ windows winapi hbitmap layered-windows

3
推荐指数
1
解决办法
3838
查看次数

C++:Hbitmap/BITMAP到.bmp文件中

好吧,整个故事是,我试图在C++中使用Leptonica + Tesseract OCR截取屏幕截图,将其保存为*.bmp文件,然后将其加载回OCR.我不需要经常这样做,但由于我似乎无法将屏幕截图数据直接复制到Leptonica PIX结构中,我需要先将其保存到文件中......实际上,最好是解决这个问题.

这是我在网上找到的一些代码,试图帮助我.

屏幕上限:

HBITMAP ScreenCapture(){
  int width=100;
  int height=100;
  // get the device context of the screen
  HDC hScreenDC = CreateDC(L"DISPLAY", NULL, NULL, NULL);     
  // and a device context to put it in
  HDC hMemoryDC = CreateCompatibleDC(hScreenDC);

  int x = GetDeviceCaps(hScreenDC, HORZRES);
  int y = GetDeviceCaps(hScreenDC, VERTRES);

  // maybe worth checking these are positive values
  HBITMAP hBitmap = CreateCompatibleBitmap(hScreenDC, x, y);

  // get a new bitmap
  HBITMAP hOldBitmap = (HBITMAP)SelectObject(hMemoryDC, hBitmap);

  BitBlt(hMemoryDC, 0, 0, width, height, …
Run Code Online (Sandbox Code Playgroud)

c++ dib hbitmap leptonica

2
推荐指数
1
解决办法
2万
查看次数