Cómo escribir un programa en VB para convertir BMP a ICO
Siga las siguientes operaciones para lograr la conversión mutua entre BMP e ICO.
Primero, cree el siguiente control de imagen del proyecto: picImage picMaskbackcolor Las propiedades son blanco y negro respectivamente. Los otros cuatro controles de imagen tienen valores predeterminados de arriba a abajo y de izquierda a derecha. Las teclas de izquierda a derecha son Command1 y Command2. código en form1: Opción ExplicitPrivate Declarar función BitBlt Lib "gdi32" (ByVal hDestDC As Long, ByVal X As Long, _
ByVal Y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hSrcDC As Long, _
ByVal xSrc As Long, ByVal ySrc As Long, ByVal dwRop As Long) As Long
Función de declaración privada CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, _
ByVal nWidth As Long, ByVal nHeight As Long) As Long
Función de declaración privada CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long Función de declaración privada SelectObject Lib "gdi32" ( ByVal hdc As Long, _
ByVal hObject As Long) As Long
Función de declaración privada DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long Función de declaración privada DeleteObject Lib "gdi32" (ByVal hObject como largo) Como función de declaración LongPrivate CreateIconIndirect Lib "user32" (icoinfo como ICONINFO) Como función de declaración LongPrivate OleCreatePictureIndirect Lib "olepro32.dll" (lppictDesc como _
pictDesc, riid como Guid, ByVal fown Mientras, ipic Como IPicture) Mientras
Función de declaración privada GetIconInfo Lib "user32" (ByVal hIcon Mientras, _
icoinfo Como ICONINFO) Mientras
Función de declaración privada SetBkColor Lib "gdi32" (ByVal hdc As Long, _
ByVal crColor As Long) As Long
Funciones de declaración privada
en CreateBitmap Lib "gdi32" (ByVal nWidth As Long, ByVal nHeight _
As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long
Tipo privado ICONINFO
fIcon mientras
xHotspot mientras
yHotspot mientras
hBMMask mientras
hBMColor como Largo
Tipo finalGuía de tipo privado
Datos1 tan largo
Datos2 como entero
Datos3 como entero
Datos4 (7) Como byte
Tipo finalTipo privado pictDesc
cbSizeofStruct Tan largo
picType tan largo
hImagen tan largo
xExt mientras
yExt mientras
End TypeConst PICTYPE_BITMAP = 1
Const PICTYPE_ICON = 3
Atenuar iGuid como Guid
Atenuar hdcMono
Atenuar bmpMono
Atenuar bmpMonoTemp
Const stdW = 32
Const stdH = 32
Dim mresult
Private Sub Form_Load()
hdcMono = CreateCompatibleDC(hdc)
bmpMono = CreateCompatibleBitmap(hdcMono, stdW, stdH)
bmpMonoTemp = SelectObject(hdcMono, bmpMono)
Con iGuid
.Data1 = amp;H20400
.Data4(0) = amp;HC0
.Data4(7) = amp;H46
Finalizar con
End Sub
Subcomando privado1_Click()
En caso de error, reanudar siguiente
Atenuar mtransp mientras
picImage.BackColor = Picture1.BackColor
mtransp = Picture1.Point(0, 0)
Crear Imagen Transparente1, picImage, mtransp
CreateMask_viaMemoryDC picImage, picMask
mresult = BitBlt(Picture2.hdc, 0, 0, stdW, stdH,
picMask.hdc, 0, 0, vbSrcAnd)
mresult = BitBlt(Picture2.hdc, 0, 0, stdW, stdH, picImage.hdc, 0, 0, vbSrcInvert)
BuildIcon Imagen2
Guardar imagen Imagen2.Imagen, App.Path y "/Frombmp.ico"
End Sub
Subcomando privado2_Click()
En caso de error, reanudar siguiente
Atenuar i, j
Atenuar p, q
Imagen4.Imagen = Imagen3.Imagen
p = Imagen4.Point(0, 0)
q = Me.BackColor
Para i = 0 a stdW
Para j = 0 a stdH p >
Si Imagen4.Point(i, j) = p Entonces
Imagen4.PSet (i, j), q
Finalizar si
Siguiente j
Siguiente i
Guardar imagen Imagen4.Imagen, App.Path amp "/Fromico.bmp"
End Sub
Privado Función CreateMask_viaMemoryDC(Pic1 As PictureBox, Pic2 As PictureBox) como booleano
En caso de error, GoTo errHandler
CreateMask_viaMemoryDC = False
Dim dx As Long, dy As Long
Atenuar hdcMono2 mientras dure, bmpMono2 mientras dure, bmpMonoTemp2 mientras dure
dx = Pic1.ScaleWidth
dy = Pic1.ScaleHeight
hdcMono2 = CreateCompatibleDC(0)
Si hdcMono2 = 0 Entonces
Ir a errHandler
Finalizar si
bmpMono2 = CreateCompatibleBitmap(hdcMono2, dx, dy)
bmpMonoTemp2 = SelectObject(hdcMono2, bmpMono2)
mresult = BitBlt(hdcMono2, 0, 0, dx, dy, Pic1.hdc, 0, 0, vbSrcCopy)< / p>
mresult = BitBlt(Pic2.hdc, 0, 0, dx, dy, hdcMono2, 0, 0, vbSrcCopy)
Llamar a SelectObject(hdcMono2, bmpMonoTemp2)
Llamar a DeleteDC(hdcMono2
)
Llamar a DeleteObject(bmpMono2)
CreateMask_viaMemoryDC = True
Función de salida
errHandler:
MsgBox " MakeMask_viaMemoryDC"
Función final
Sub ExtractIconComposite privado (en imagen como cuadro de imagen)
En caso de error, reanudar siguiente
Atenuar imagen como imagen IP
p>
Atenuar icoinfo como ICONINFO
Atenuar pDesc como pictDesc
Atenuar hDCWork
Atenuar hBMOldWork
Atenuar hNewBM
Dim hBMOldMono
GetIconInfo inPic.Picture, icoinfo
hDCWork = CreateCompatibleDC(0)
hNewBM = CreateCompatibleBitmap(inPic.hdc, stdW , stdH )
hBMOldWork = SelectObject(hDCWork, hNewBM)
hBMOldMono = SelectObject(hdcMono, icoinfo.hBMMask)
BitBlt hDCWork, 0, 0, stdW , stdH , hdcMono, 0, 0, vbSrcCopy
SelectObject hdcMono, hBMOldMono
SelectObject hDCWork, hBMOldWork
Con pDesc
.cbSizeofStruct = Len (pDesc)
.picType = PICTYPE_BITMAP
.hImage = hNewBM
Finalizar con
OleCreatePictureIndirect pDesc, iGuid, 1, ipic
picMask = ipic
Establecer ipic = Nada
pDesc.hImage = icoinfo.hBMColor
OleCreatePictureIndirect pDesc, iGuid, 1, ipic
picImage = ipic
DeleteObject icoinfo.hBMMask
DeleteDC hDCWork
Establecer hBMOldWork = Nada
Establecer hBMOldMono = Nada
End Sub
Private Sub BuildIcon(inPic As PictureBox)
En caso de error, reanudar siguiente
Atenuar hOldMonoBM
Atenuar hDCWork
Atenuar hBM
OldWork
Atenuar hBMWork
Atenuar ipic como IPicture
Atenuar pDesc como pictDesc
Atenuar icoinfo como ICONINFO
BitBlt hdcMono, 0, 0, stdW, stdH, picMask.hdc, 0, 0, vbSrcCopy
SelectObject hdcMono, bmpMonoTemp
hDCWork = CreateCompatibleDC(0)
Con inPic
hBMWork = CreateCompatibleBitmap(inPic.hdc, stdW, stdH)
Finalizar con
hBMOldWork = SelectObject(hDCWork, hBMWork) p>
BitBlt hDCWork, 0, 0, stdW, stdH, picImage.hdc, 0, 0, vbSrcCopy
SelectObject hDCWork, hBMOldWork
Con icoinfo
.fIcon = 1
.xHotspot = 16
.yHotspot = 16
.hBMMask = bmpMono
.hBMColor = hBMWork p>
Termina con
Con pDesc
.cbSizeofStruct = Len(pDesc)
.picType = PICTYPE_ICON
.hImage = CreateIconIndirect(icoinfo)
Finalizar con
OleCreatePictureIndirect pDesc, iGuid, 1, ipic
inPic.Picture = LoadPicture()
inPic = ipic
bmpMonoTemp = SelectObject(hdcMono, bmpMono)
DeleteObject icoinfo.hBMMask
DeleteDC hDCWork
Establecer hBMOldWork = Nada
End Sub
Sub CreateTransparent(inpicSrc As PictureBox, inpicDest As PictureBox, _
inTrasparentColor As Long)
Al reanudar con error Siguiente
Atenuar mMaskDC durante el tiempo
Atenuar mMaskBmp durante el tiempo
Atenuar mTempMaskBMP durante el tiempo
Atenuar mMonoBMP durante el tiempo
Atenuar mMonoDC mientras
Atenuar mTempMonoBMP mientras
Atenuar mSrcHDC mientras, mDestHDC
Mientras
Dim w Mientras, h Mientras
w = inpicSrc.ScaleWidth
h = inpicSrc.ScaleHeight
mSrcHDC = inpicSrc.hdc
mDestHDC = inpicDest.hdc
mresult = SetBkColoramp; (mSrcHDC, inTrasparentColor)
mresult = SetBkColoramp; (mDestHDC, inTrasparentColor)
mMaskDC = CreateCompatibleDC(mDestHDC)
mMaskBmp = CreateCompatibleBitmap(mDestHDC, w, h)
mTempMaskBMP = SelectObject(mMaskDC, mMaskBmp)
mMonoDC = CreateCompatibleDC(mDestHDC)
mMonoBMP = CreateBitmap(w, h, 1, 1, 0)
mTempMonoBMP = SelectObject(mMonoDC, mMonoBMP)
mresult = BitBlt(mMonoDC, 0, 0, w, h, mSrcHDC, 0, 0, vbSrcCopy)
mresult = BitBlt(mMaskDC, 0, 0, w, h, mMonoDC, 0, 0, vbSrcCopy)
mMonoBMP = SeleccionarObjeto(mMonoDC, mTempMonoBMP)
mresult = EliminarObjeto(mMonoBMP)
mresult = EliminarDC(mMonoDC)
mresult = BitBlt (mDestHDC, 0, 0, w, h, mSrcHDC, 0, 0, vbSrcInvert)
mresult = BitBlt(mDestHDC, 0, 0, w, h, mMaskDC, 0, 0, vbSrcAnd) p> p>
BitBlt mDestHDC, 0, 0, w, h, mSrcHDC, 0, 0, vbSrcInvert
inpicDest.Picture = inpicDest.Image
mMaskBmp = SelectObject( mMaskDC, mTempMaskBMP)
mresult = DeleteObject(mMaskBmp)
mresult = DeleteDC(mMaskDC)
End Sub
Sub privado Form_QueryUnload( Cancelar como entero, UnloadMode como entero)
SelectObject bmpMono, bmpMonoTemp
DeleteObject bmpMono
DeleteDC hdcMono
Fin del subtítulo