ReDim p(1 To lWidth, 1 To lHeight) As RGBQUAD 这个定义有问题,在24位模式下不能使用RGBQUAD中的保留字节在24位模式, Public Type RGBQUAD '只有bibitcount为1,2,4时才有调色板 Blue As Byte '蓝色分量 Green As Byte '绿色分量 Red As Byte '红色分量 'Reserved As Byte '保留值 24位时,不能有这个参数 End Type但去掉这个参数,你的代码还有问题,会崩溃
24位的图像 用这个ReDim p(1 To lWidth, 1 To lHeight) As RGBQUAD(RGBQUAD不包含Reserved 成员时)方式来保存图像数据只有在图像宽度本身是4的倍数时才是正确的,否则都得不到正确的结果,并且可能会导致访问内存错误。 具体参考:http://www.cnblogs.com/laviewpbt/archive/2009/05/31/1492878.html
终于给LZ搞好了,记得给分,嘿嘿 Command1_Click()使用本代码替代Private Sub Command1_Click() Dim PicX As StdPicture
Set p = New Class1 sUrl = "http://www1.yaoshi.com/TestImageServlet" Set XMLHTTP = CreateObject("Msxml2.XMLHTTP") XMLHTTP.Open "GET", sUrl, False XMLHTTP.send
Dim GUID(3) As Long GUID(0) = &H7BF80981 'stdPicture的GUID GUID(1) = &H101ABF32 GUID(2) = &HAA00BB8B GUID(3) = &HAB0C3000 Call OleLoadPicture(ByVal ObjPtr(XMLHTTP.responseStream), 0&, 0&, GUID(0), PicX)
p.LoadFromStdPicture PicX, 32 p.ShowToPicture Picture1(0) Set Image1(0) = Picture1(0).image XMLHTTP.abort ’应该没有必要 Set XMLHTTP = Nothing End SubDim mPixByte As Long'定义到class1的模块变量中class1中,LoadFromStdPicture使用以下代码替代 Public Function LoadFromStdPicture(ByRef StdPic As StdPicture, Optional ByVal Bits As Integer = 24) Dim mHdc As Long, mBmp As Long Dim mLine As Long
ReDim p(1 To lWidth * mPixByte, 1 To lHeight) As Byte mLine = GetDIBits(mHdc, StdPic.Handle, 0, lHeight, p(1, 1), bMapinfo, DIB_RGB_COLORS) DeleteDC mHdc End Functionclass1 中Invert使用以下代码替代 Public Function Invert() Dim i As Integer, j As Integer For j = 1 To lHeight For i = 1 To lWidth * mPixByte Step mPixByte p(i, j) = &HFF - p(i, j) p(i + 1, j) = &HFF - p(i + 1, j) p(i + 2, j) = &HFF - p(i + 2, j) Next Next End Function
这个定义有问题,在24位模式下不能使用RGBQUAD中的保留字节在24位模式,
Public Type RGBQUAD '只有bibitcount为1,2,4时才有调色板
Blue As Byte '蓝色分量
Green As Byte '绿色分量
Red As Byte '红色分量
'Reserved As Byte '保留值 24位时,不能有这个参数
End Type但去掉这个参数,你的代码还有问题,会崩溃
具体参考:http://www.cnblogs.com/laviewpbt/archive/2009/05/31/1492878.html
建议换成一维Byte数组,或采用32位DIB中转
这只是个习惯问题,多维数组速度上要吃些亏
Dim mHdc As Long, mPtr As Long, hDc As Long
Erase p
lWidth = StdPic.Width * 1440 / 2540 / Screen.TwipsPerPixelX
lHeight = StdPic.Height * 1440 / 2540 / Screen.TwipsPerPixelY
mHdc = CreateCompatibleDC(0) '创建DIB设备场景
With bMapinfo.bmiHeader '位图信息头
.biSize = Len(bMapinfo.bmiHeader)
.biPlanes = 1
.biBitCount = Bits '24或32
.biWidth = lWidth
.biHeight = lHeight
.biCompression = BI_RGB
Select Case Bits '保证每个扫描行必须是4的倍数
Case 1
mWidthBytes = (((.biWidth + 7) \ 8 + 3) And &HFFFFFFFC)
Case 4
mWidthBytes = (((.biWidth + 1) \ 2 + 3) And &HFFFFFFFC)
Case 8
mWidthBytes = ((.biWidth + 3) And &HFFFFFFFC)
Case 16
mWidthBytes = ((.biWidth * 2 + 3) And &HFFFFFFFC)
Case 24
mWidthBytes = ((.biWidth * 3 + 3) And &HFFFFFFFC)
Case 32
mWidthBytes = .biWidth * 4
Case Else
'ERR
End Select
.biSizeImage = mWidthBytes * .biHeight
End With
mhDib = CreateDIBSection(mHdc, bMapinfo.bmiHeader, DIB_RGB_COLORS, mPtr, 0, 0) 'mPtr就是创建的DIBSECTION的内存地址
mhOldDib = SelectObject(mHdc, mhDib)
StdPic.Render mHdc + 0, 0, 0, lWidth + 0, lHeight + 0, 0, StdPic.Height, StdPic.Width, -StdPic.Height, ByVal 0
hDc = GetDC(0)
ReDim p(1 To lWidth, 1 To lHeight) As RGBQUAD
'GetDIBits hDc, StdPic.Handle, 0, lHeight, p(1, 1), bMapinfo, DIB_RGB_COLORS
这里要怎么写?????
SelectObject mHdc, mhOldDib
DeleteObject mhDib: DeleteObject mHdc: ReleaseDC 0, hDc
End Function
帮我看下改的可对?有问题吗?复制那里要怎么写??
我已经百度的头晕了。。
Command1_Click()使用本代码替代Private Sub Command1_Click()
Dim PicX As StdPicture
Set p = New Class1
sUrl = "http://www1.yaoshi.com/TestImageServlet"
Set XMLHTTP = CreateObject("Msxml2.XMLHTTP")
XMLHTTP.Open "GET", sUrl, False
XMLHTTP.send
Dim GUID(3) As Long
GUID(0) = &H7BF80981 'stdPicture的GUID
GUID(1) = &H101ABF32
GUID(2) = &HAA00BB8B
GUID(3) = &HAB0C3000 Call OleLoadPicture(ByVal ObjPtr(XMLHTTP.responseStream), 0&, 0&, GUID(0), PicX)
p.LoadFromStdPicture PicX, 32
p.ShowToPicture Picture1(0)
Set Image1(0) = Picture1(0).image
XMLHTTP.abort ’应该没有必要
Set XMLHTTP = Nothing
End SubDim mPixByte As Long'定义到class1的模块变量中class1中,LoadFromStdPicture使用以下代码替代
Public Function LoadFromStdPicture(ByRef StdPic As StdPicture, Optional ByVal Bits As Integer = 24)
Dim mHdc As Long, mBmp As Long
Dim mLine As Long
Erase p
lWidth = StdPic.Width * 1440 / 2540 / Screen.TwipsPerPixelX
lHeight = StdPic.Height * 1440 / 2540 / Screen.TwipsPerPixelY
mHdc = CreateCompatibleDC(0) With bMapinfo.bmiHeader
.biSize = Len(bMapinfo.bmiHeader)
.biWidth = lWidth
.biHeight = lHeight 'BMP位图默认的扫描方式是从下到上
.biPlanes = 1
.biBitCount = Bits
mPixByte = Bits / 8
.biCompression = BI_RGB '无压缩
mWidthBytes = (((lWidth * bMapinfo.bmiHeader.biBitCount) + &H1F) And &HFFFFFFE0) \ &H8
.biSizeImage = mWidthBytes * lHeight
End With
ReDim p(1 To lWidth * mPixByte, 1 To lHeight) As Byte
mLine = GetDIBits(mHdc, StdPic.Handle, 0, lHeight, p(1, 1), bMapinfo, DIB_RGB_COLORS)
DeleteDC mHdc
End Functionclass1 中Invert使用以下代码替代
Public Function Invert()
Dim i As Integer, j As Integer
For j = 1 To lHeight
For i = 1 To lWidth * mPixByte Step mPixByte
p(i, j) = &HFF - p(i, j)
p(i + 1, j) = &HFF - p(i + 1, j)
p(i + 2, j) = &HFF - p(i + 2, j)
Next
Next
End Function
p.LoadFromStdPicture PicX, 24
p.LoadFromStdPicture PicX, 32都可以
应该改为:
ReDim p(1 To mWidthBytes , 1 To lHeight) As Byte