社区
图形处理/算法
帖子详情
GDI+ Bitmap 参数问题
tsys2000
2008-08-27 05:44:12
Gdi 的语句 HBITMAP hBitmap = (HBITMAP)CreateBitmap( width, height, 1, 32 , m_Data );
在GDI+上该怎么初始化?
Bitmap bmp(width, height, ?, ?, m_Data );
谢谢
...全文
58
回复
打赏
收藏
GDI+ Bitmap 参数问题
Gdi 的语句 HBITMAP hBitmap = (HBITMAP)CreateBitmap( width, height, 1, 32 , m_Data ); 在GDI+上该怎么初始化? Bitmap bmp(width, height, ?, ?, m_Data ); 谢谢
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
VB用
GDI+
把图片保存为JPEG(即JPG)格式
这个功能用到的地方很多,
GDI+
是系统的工具,但是发布较晚,所以没有完全普及。我写这篇文章应用到他的部分功能,给大家参考参考。 这个函数可以将 StdPicture 对象用
GDI+
解码器保存为 JPEG格式文件。 Quality
参数
是清晰度,越低越模糊,但是压缩更高。
CS
Bitmap
类,可用于储存DIB位图,也可用于储存二维数列,解决二维数列传递不方便的
问题
,效率比GDI的
bitmap
高
class CS
Bitmap
//
Bitmap
类,特点紧约型数据结构,GetPixel效率高,放弃调色板,自动支持4种色深,特有的12位颜色更接近人眼可识别颜色数目;有多种缩放,色深转换,拷贝,剪切,和h
Bitmap
转换,显示等功能;支持串行化。支持1,12,24,32位位图,对应适用于所有函数,相比于H
Bitmap
和CS
Bitmap
对象要简单,可直接操作数据区;同时可用于1,4,8,12,16,24,32位二维数列的储存,部分基本函数(GetPixel,SetPixel)支持; { public: CS
Bitmap
(void); ~CS
Bitmap
(void); unsigned int Width; //
Bitmap
的宽 unsigned int Height; //
Bitmap
的高 DWORD BitSize; //
Bitmap
的数据区大小(字节) BYTE* pBitData; //
Bitmap
的数据区指针 unsigned int BitCount; //
Bitmap
的色深 bool SetAttribute(unsigned int mWidth=NULL, unsigned int mHeight=NULL, unsigned int mBitCount=NULL); //设置
Bitmap
的属性,
Bitmap
会被清除 mWidth
Bitmap
的宽度,为NULL则不改变 mHeight
Bitmap
的高度,为NULL则不改变 mBitCount
Bitmap
的色深,为NULL则不改变 bool ImportBits(BYTE* lpBits, int mBitSize=NULL); //拷贝Bits数据进对象数据区 lpBits 拷贝数据的指针 mBitSize 拷贝数据的字节数 COLORREF GetPixel(unsigned int x, unsigned int y); //获得某点的原始数值,当为12,24,32位数时,则为RGB值 X,y 需要获取点的坐标 bool SetPixel(unsigned int x, unsigned int y, COLORREF clr); //获得某点的原始数值,当为12,24,32位数时,则为RGB值 X,y 需要设置点的坐标 bool StretchDIB(CS
Bitmap
* DestBmp, unsigned int mWidth, unsigned int mHeight, unsigned int mFlag=0); //缩放 DestBmp用于获取缩放后图片的指针 mWidth, mHeight缩放后大小 mFlag缩放算法 取值 算法 缩小 放大 0 逆向寻点算法 效率高,质量一般 效率高,质量中 1 双线性补点 效率低,质量一般 效率低,质量高 2 平均值算法 效率低,质量好 效率高,质量差 static BYTE GetRValue12(COLORREF Clr12Bit); static BYTE GetGValue12(COLORREF Clr12Bit); static BYTE GetBValue12(COLORREF Clr12Bit); //用于12位图的获取RGB分量,24位图,32位图的COLOR分离请用GDI的GetPixel() Clr12Bit 对12位图GetPixel获得的原始值 static COLORREF RGB12(BYTE R, BYTE G, BYTE B); //用于12位图的RGB合成,24位图,32位图的COLOR合成请用GDI的RGB() static COLORREF Color24To1(COLORREF Color24); //24位色深COLORREF转1位色深(黑白)值 static COLORREF Color24To12(COLORREF Color24); //24位色深COLORREF转12位色深值 static COLORREF Color1To24(COLORREF Color2); //1位色深COLORREF转24位,32位色深(黑白)值 static COLORREF Color12To24(COLORREF Color12); //12位色深COLORREF转24位,32位色深(黑白)值 bool ConvertTo1Bit(CS
Bitmap
* DestBmp); //12,24,36位图片转换成1位色深图 DestBmp用于接收数据的DestBmp指针,转换过程中包括自动
参数
重置 bool ConvertTo12Bit(CS
Bitmap
* DestBmp); //1,24,36位图片转换成12位色深图 DestBmp用于接收数据的DestBmp指针,转换过程中包括自动
参数
重置 bool ConvertTo24Bit(CS
Bitmap
* DestBmp); //1,12,36位图片转换成24位色深图 DestBmp用于接收数据的DestBmp指针,转换过程中包括自动
参数
重置 bool FromHandle(H
BITMAP
h
Bitmap
); //从H
BITMAP
中获得CS
Bitmap
对象 bool CopyPaste(CS
Bitmap
* DestBmp, unsigned int x, unsigned int y); //复制本CS
Bitmap
至另一DestBmp的指定位置 DestBmp 目标,对象 X,y复制后图片左上角位置 bool PaintDIB(CDC* dcDest, int x,int y,unsigned int mWidth, unsigned int mHeight); //把本图片显示至CDC对象上,支持1,12,24,26位图 dcDest 目标dc(兼容DC) x,y 拷贝到dc上的位置 mWidth,mHeight拷贝后的大小 const CS
Bitmap
& operator=(const CS
Bitmap
&SBmp); }; //重载了 = 赋值操作符
抓图的VC++实现,轻松保存成各种常用格式
本工程为一个DLL,在获取指定区域的
bitmap
之后,通过
GDI+
轻松将
bitmap
保存成各种常用格式(主要在CImage.Save()的第二个
参数
中指定各种格式)
截图软件6.0版 任意格式图片在内存中转换 例如:bmp在内存中转为jpg
最近搜索了些在内存中转换图片格式的东西,比如截屏后的bmp图片在内存中转为jpg数据流,你可以通过socket发送这段jpg内存数据流,同时,你也可以通过内存数据流逆转换。通过DibFile.h里面的两个函数完成(用的是
Gdi+
库):
Bitmap
* Create
Bitmap
FromMemory(const void *buf, size_t size); void* Save
Bitmap
ToMemory(
Bitmap
*image, void **outbuf, size_t *size, size_t CodecIndex=0, ULONG quality=50); 说明:CodecIndex取值0-4,分别对应转换为jpg、bmp、gif、png、tiff格式,当为0时,
参数
quality有用,表示转换jpg的质量,取值0-100,数值越小,压缩比越大。注意:outbuf为指针的指针,会在内部malloc内存,以保存转换后的图片数据流。 虽然此软件中没用到这两个函数,但是测试通过。 你可以进行如下测试:把jpg图片以二进制数据读到内存中,然后通过Create
Bitmap
FromMemory函数构建
Bitmap
,然后再Save
Bitmap
ToMemory转换为另一段内存中,把这段内存以二进制数据存入文件,并用其他看图软件打开保存后的图片。 其他说明:此软件在先前版本的基础上修正两处Bug: 1.保存图片时,若文件名含有点,会保存失败; 2.若在浏览图片时,另存图片后,滚动滚轮显示未知格式图片。 加入一个功能:保存为jpg图片时,可以选择图片质量。 有
问题
联系:hastings1986@163.com
再谈VB制作不规则窗口
由于使用了一些新的函数,本程序必须在Windows2000下运行。 Option Explicit Public Declare Function GetObjectAPI Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As Long, lpObject As Any) As Long Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long Public Declare Function SetWindowRgn Lib "user32" (ByVal hwnd As Long, ByVal hRgn As Long, ByVal bRedraw As Boolean) As Long Public Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long Public Declare Function CombineRgn Lib "gdi32" (ByVal hDestRgn As Long, ByVal hSrcRgn1 As Long, ByVal hSrcRgn2 As Long, ByVal nCombineMode As Long) As Long Public Const RGN_OR = 2 Public Declare Function Get
Bitmap
Bits Lib "gdi32" (ByVal h
Bitmap
As Long, ByVal dwCount As Long, lpBits As Any) As Long Public Declare Function Set
Bitmap
Bits Lib "gdi32" (ByVal h
Bitmap
As Long, ByVal dwCount As Long, lpBits As Any) As Long Public Type
BITMAP
bmType As Long bmWidth As Long bmHeight As Long bmWidthBytes As Long bmPlanes As Integer bmBitsPixel As Integer bmBits As Long End Type Public Const
BITMAP
_SIZE = 24 '=Len(
BITMAP
) Dim bmByte() As Byte Public Declare Function ReleaseCapture Lib "user32" () As Long Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long Public Const HTCAPTION = 2 Public Const WM_NCLBUTTONDOWN = &HA1; Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long Public Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long Public Const WS_EX_LAYERED = &H80000; Public Const GWL_EXSTYLE = (-20) Public Const LWA_ALPHA = &H2; Public Const LWA_COLORKEY = &H1; Public Sub SetAutoRgn(hForm As Form, Optional transColor As Byte = vbNull) Dim X As Long, Y As Long Dim Rgn1 As Long, Rgn2 As Long Dim SPos As Long, EPos As Long Dim bm As
BITMAP
Dim hbm As Long Dim Wid As Long, Hgt As Long Dim xoff As Long, yoff As Long '获取窗体背景图片尺寸 hbm = hForm.Picture GetObjectAPI hbm, Len(bm), bm Wid = bm.bmWidth Hgt = bm.bmHeight With hForm .ScaleMode = vbPixels xoff = (.ScaleX(.Width, vbTwips, vbPixels) - .ScaleWidth) / 2 yoff = .ScaleY(.Height, vbTwips, vbPixels) - .ScaleHeight - xoff '改变窗体尺寸 .Width = (Wid + xoff * 2) * Screen.TwipsPerPixelX .Height = (Hgt + xoff + yoff) * Screen.TwipsPerPixelY End With ReDim bmByte(1 To Wid, 1 To Hgt) Get
Bitmap
Bits hbm, Wid * Hgt, bmByte(1, 1) '获取图像数组 '如果没有传入transColor
参数
,则用第一个像素作为透明色 If transColor = vbNull Then transColor = bmByte(1, 1) Rgn1 = CreateRectRgn(0, 0, 0, 0) For Y = 1 To Hgt '逐行扫描 X = 0 Do X = X + 1 While (bmByte(X, Y) = transColor) And (X < Wid) X = X + 1 '跳过是透明色的点 Wend SPos = X While (bmByte(X, Y) <> transColor) And (X < Wid) X = X + 1 '跳过不是透明色的点 Wend EPos = X - 1 '这一段是合并区域 If SPos <= EPos Then Rgn2 = CreateRectRgn(SPos - 1 + xoff, Y - 1 + yoff, EPos + xoff, Y + yoff) CombineRgn Rgn1, Rgn1, Rgn2, RGN_OR DeleteObject Rgn2 End If Loop Until X >= Wid Next Y SetWindowRgn hForm.hwnd, Rgn1, True '设定窗体形状区域 DeleteObject Rgn1 End Sub Option Explicit Private Sub Form_DblClick() Unload Me End Sub Private Sub Form_Load() 'Me.Show Dim t As Single Dim rtn As Long rtn = GetWindowLong(hwnd, GWL_EXSTYLE) rtn = rtn Or WS_EX_LAYERED SetWindowLong hwnd, GWL_EXSTYLE, rtn SetLayeredWindowAttributes hwnd, 0, 192, LWA_ALPHA '半透明 'SetLayeredWindowAttributes hwnd, &H0;, 0, LWA_COLORKEY '去除透明色 t = Timer If Me.Picture <> 0 Then Call SetAutoRgn(Me) ', 0) End If 'MsgBox "运行时间:" & Timer - t & "秒", vbInformation End Sub Private Sub Form_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) If Button = vbLeftButton Then ReleaseCapture SendMessage Me.hwnd, WM_NCLBUTTONDOWN, HTCAPTION, 0& End If End Sub
图形处理/算法
19,469
社区成员
50,697
社区内容
发帖
与我相关
我的任务
图形处理/算法
VC/MFC 图形处理/算法
复制链接
扫一扫
分享
社区描述
VC/MFC 图形处理/算法
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章