24 Октябрь 2009

Преобразование .bmp в .ico

Мультимедиа |  Таги: , ,

Преобразование .bmp в .ico

Option Explicit

Private Declare Function CreateIconIndirect Lib "user32.dll" (piconinfo As ICONINFO) As Long
Private Declare Sub OleCreatePictureIndirect Lib "oleaut32.dll" (ByRef lpPictDesc As PictDesc, riid As Guid, ByVal fOwn As Long, lplpvObj As Any)
Private Declare Function DestroyIcon Lib "user32.dll" (ByVal hIcon As Long) As Long

Private Declare Function GetDC Lib "user32.dll" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32.dll" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function CreateCompatibleDC Lib "gdi32.dll" (ByVal hdc As Long) As Long

Private Declare Function CreateCompatibleBitmap Lib "gdi32.dll" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
Private Declare Function CreateBitmap Lib "gdi32.dll" (ByVal nWidth As Long, ByVal nHeight As Long, ByVal nPlanes As Long, ByVal nBitCount As Long, lpBits As Any) As Long

Private Declare Function SelectObject Lib "gdi32.dll" (ByVal hdc As Long, ByVal hObject As Long) As Long

Private Declare Function SetTextColor Lib "gdi32.dll" (ByVal hdc As Long, ByVal crColor As Long) As Long
Private Declare Function GetTextColor Lib "gdi32.dll" (ByVal hdc As Long) As Long
Private Declare Function SetBkColor Lib "gdi32.dll" (ByVal hdc As Long, ByVal crColor As Long) As Long
Private Declare Function GetBkColor Lib "gdi32.dll" (ByVal hdc As Long) As Long

Private Declare Function BitBlt Lib "gdi32.dll" (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 RasterOpConstants) As Long
Private Declare Function GetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function SetPixel Lib "gdi32.dll" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long

Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
Private Declare Function DeleteDC Lib "gdi32.dll" (ByVal hdc As Long) As Long

Private Type ICONINFO
    fIcon           As Long
    xHotspot        As Long
    yHotspot        As Long
    hBmMask         As Long
    hBmColor        As Long
End Type
Private Type PictDesc
    cbSizeofStruct  As Long
    picType         As Long
    hImage          As Long
    xExt            As Long
    yExt            As Long
End Type
Private Type Guid
    Data1           As Long
    Data2           As Integer
    Data3           As Integer
    Data4(0 To 7)   As Byte
End Type

Dim hIcon As Long

Private Sub Command1_Click()
'Загрузка BMP
With Me.CommonDialog1
    .Filter = "Точечный рисунок (*.bmp)|*.bmp"
    .ShowOpen
    If .FileName = "" Then Exit Sub
    Set Me.Picture1.Picture = LoadPicture(.FileName)
End With
End Sub

Private Sub Command2_Click()
'Преобразование BMP в ICO
    Dim a
    hIcon = PicToIco(Me.Picture1.hdc, 32, 32)
    Set Me.Image1.Picture = Nothing
    Set Me.Image1.Picture = IconToPicture(hIcon)
End Sub

Private Sub Command3_Click()
'Сохранение ICO
With Me.CommonDialog1
    .Filter = "ICO (*.ico)|*.ico"
    .ShowSave
    If .FileName = "" Then Exit Sub
    SavePicture IconToPicture(hIcon), .FileName
End With
End Sub

Private Sub Form_Load()
With Me
    .Command1.Caption = "Открыть *.bmp"
    .Command2.Caption = "Преобразовать"
    .Command3.Caption = "Сохранить *.ico"
End With
End Sub

Private Sub Form_QueryUnload(Cancel As Integer, UnloadMode As Integer)
    Call DestroyIcon(hIcon)
End Sub

Public Function PicToIco(ByVal hSrcDC As Long, _
                         ByVal nWidth As Long, _
                         ByVal nHeight As Long, _
                Optional ByVal lMaskColor As Long = &HFFFF) As Long

    Dim hDCMask As Long, hDCColor As Long, hScrDC As Long, hDstDC As Long
    Dim hBmMask As Long, hBmColor As Long
    Dim hBmColorOld As Long, hBmMaskOld As Long
    Dim Ico As ICONINFO

    hScrDC = GetDC(0&)
    hDstDC = CreateCompatibleDC(hSrcDC)
    ' Создаем цветную картинку
    hBmColor = CreateCompatibleBitmap(hSrcDC, nWidth, nHeight)
    ' Создаем черно-белую картинку
    hBmMask = CreateBitmap(nWidth, nHeight, 1&, 1&, ByVal 0&)
    ' Создаем DC
    hDCColor = CreateCompatibleDC(hSrcDC)
    ' Объединяем...
    hBmColorOld = SelectObject(hDCColor, hBmColor)
    ' Ставим нашему DC цвета исходного
    Call SetBkColor(hDCColor, GetBkColor(hSrcDC))
    Call SetTextColor(hDCColor, GetTextColor(hSrcDC))
    ' Копируем исходную картинку
    Call BitBlt(hDCColor, 0&, 0&, nWidth, nHeight, hSrcDC, 0&, 0&, vbSrcCopy)
    ' Создаем маску и
    hDCMask = CreateCompatibleDC(hSrcDC)
    ' Крепим ее к DC
    hBmMaskOld = SelectObject(hDCMask, hBmMask)
    ' Цвет маски ...
    If lMaskColor = &HFFFF Then lMaskColor = GetPixel(hSrcDC, 0&, 0&)
    ' Ставим прозрачный цвет основным
    Call SetBkColor(hDCColor, lMaskColor)
    Call SetTextColor(hDCColor, vbWhite)
    ' Создаем маску
    Call BitBlt(hDCMask, 0, 0, nWidth, nHeight, hDCColor, 0, 0, vbSrcCopy)
    ' Ставим цвет и создаем белую маску (XOR)
    Call SetTextColor(hDCColor, vbBlack)
    Call SetBkColor(hDCColor, vbWhite)
    ' Ставим бел. маску на ненужные места
    Call BitBlt(hDCColor, 0, 0, nWidth, nHeight, hDCMask, 0, 0, &H220326)
    ' Накладываем маску
    Call BitBlt(hDstDC, 0, 0, nWidth, nHeight, hDCMask, 0, 0, vbSrcAnd)
    ' Объединяем содержимое картинки и hdcColor
    Call BitBlt(hDstDC, 0, 0, nWidth, nHeight, hDCColor, 0, 0, vbSrcPaint)

    Ico.fIcon = True
    Ico.hBmColor = SelectObject(hDCColor, hBmColorOld)
    Ico.hBmMask = SelectObject(hDCMask, hBmMaskOld)
    PicToIco = CreateIconIndirect(Ico)
    'Очистка
    Call DeleteObject(Ico.hBmColor)
    Call DeleteDC(hDCColor)
    Call DeleteObject(Ico.hBmMask)
    Call DeleteDC(hDCMask)
    Call DeleteDC(hDstDC)
    Call ReleaseDC(0&, hScrDC)
End Function

Private Function IconToPicture(ByVal hIcon As Long) As IPicture
    Dim iPic As IPicture, picDes As PictDesc, iidIPicture As Guid
    With picDes
        .cbSizeofStruct = Len(picDes)
        .picType = &H3
        .hImage = hIcon
    End With
    With iidIPicture
        .Data1 = &H7BF80980
        .Data2 = &HBF32
        .Data3 = &H101A
        .Data4(0) = &H8B
        .Data4(1) = &HBB
        .Data4(2) = &H0
        .Data4(3) = &HAA
        .Data4(4) = &H0
        .Data4(5) = &H30
        .Data4(6) = &HC
        .Data4(7) = &HAB
    End With
    Call OleCreatePictureIndirect(picDes, iidIPicture, True, IconToPicture)
End Function


Оставить комментарий

Я не робот.