Tag: hbitmap

我怎样才能免费获得hbitmap

您好我有以下函数,我后来从c#使用以显示位图“Bitmap.FromHbitmap(IntPtr)”但在几次使用后,这以内存泄漏结束。 IntPtr GetFrame(int Width,int Height,int nFrame) { width= Width; height = Height; HBITMAP hb; m_piHelper->GetBmp(width,height,nFrame,&hb); return IntPtr(hb); } 可能我应该删除对象,但我不知道我能做什么,我在返回之前尝试过,但我最终没有图像,但gdi错误 谢谢,

将HBitmap转换为保留alpha通道的位图

我一直在Google和Stack Overflow中搜索,但我找不到一个有效的例子。 我需要将HBitmap转换为Managed .NET位图,但以下代码不保留alpha通道 。 private static Bitmap GetBitmapFromHBitmap(IntPtr nativeHBitmap) { Bitmap bmp = Bitmap.FromHbitmap(nativeHBitmap); return bmp; } 我在SO中找到了这个答案 ,但它对我不起作用,这个例子保留了透明度,但它将我的图像在Y轴上翻转180º并将其旋转180º。 我不知道为什么。 这个其他例子似乎有效,但它是C ++ 有人在C#中工作,非常重要,没有内存泄漏? 提前致谢。 编辑 :关于@Hans Passant的评论,我使用以下代码获取HBitmap(它是一个shell调用,用于从操作系统获取缩略图或图标(仅限Vista和Win7)。 private static IntPtr GetHBitmap(string fileName, int width, int height, ThumbnailOptions options) { IShellItem nativeShellItem; Guid shellItem2Guid = new Guid(IShellItem2Guid); int retCode = SHCreateItemFromParsingName(fileName, IntPtr.Zero, ref shellItem2Guid, out […]

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

假设我从本机Windows函数中获取HBITMAP对象/句柄。 我可以使用Bitmap.FromHbitmap(nativeHBitmap)将其转换为托管位图,但如果原生图像具有透明度信息(alpha通道),则此转换会丢失它。 有关此问题的Stack Overflow有几个问题。 使用来自这个问题的第一个答案的信息( 如何使用GDI +绘制ARGB位图? ),我写了一段代码,我尝试过并且有效。 它基本上使用GetObject和BITMAP结构获取本机HBitmap宽度,高度和指向像素数据位置的指针,然后调用托管Bitmap构造函数: Bitmap managedBitmap = new Bitmap(bitmapStruct.bmWidth, bitmapStruct.bmHeight, bitmapStruct.bmWidth * 4, PixelFormat.Format32bppArgb, bitmapStruct.bmBits); 据我所知(如果我错了,请纠正我),这不会将实际像素数据从原生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 […]