vb中如何将图像bmp文件格式转换为jpg文件格式

时间:2021-10-05 06:35:58
vb中如何将图像bmp文件格式转换为jpg文件格式?

5 个解决方案

#1


你可以在http://vbaccelerator.com/codelib/gfx/vbjpeg.htm下载一个免费的JPEG控件,该控件提供了SaveJPG函数可以用来保存图像为.jpg格式。如果要转换.bmp文件,可以先将其读入一个Picture控件,再使用SaveJPG函数。如: 
     Dim c As New cDibSection 
     
     picThis.LoadPicture "c:\my\my.bmp" 
     ' 转换Picture对象到DIBSection: 
     c.CreateFromPicture picThis.Picture 
     ' Save it: 
     SaveJPG c, sFileName 

一个处理各种图象格式的站点。包括JPG ,PNG ,MPEG、MP3 等http://www.colosseumbuilders.com/graphicslinks.htm

#2


以前写过些类似的程序,要将大批信息显示在屏幕上,并供投影仪使用。其实就是BMP文件的转换问题。不过不涉及JPG文件格式。
给出部分函数,希望对你的思考有益:

Public Function SaveBmp(Pic As PictureBox, FilePathName$) As Long
'=======================================================================
'  函数功能:从图片框取得一幅颜色格式的位图,并将其转换为黑白格式
'  入口参数:PIC 图片框;FILEPATHAME$ 存放位图路径
'  程序编制:cobra
'  编制时间:2003-06-10
'=======================================================================
    Dim bm                As BITMAP
    Dim SizeOfArry        As Long
    Dim fp                As Long
    Dim bf                As BitMapFileHeader
    Dim bi                As BitMapInfo
    Dim Buffer()          As Byte
    Dim hDc               As Long
    Dim hDIB              As Long
    Dim OldObj            As Long
    Dim I                 As Long
    Dim J                 As Integer
    
'取得BMP位图文件结构
    On Error GoTo Err
    Call GetObject(Pic.Picture, Len(bm), bm)

'取得每条扫描线的字节数(必须是4的倍数)
    SizeOfArry = (((bm.bmWidth / 8 + 3) \ 4) * 4) * bm.bmHeight

'设置要创建的位图的文件头信息
    With bf
        .bfType = "BM"                            'BMP文件识别码
        .bfSize = Len(bf) + Len(bi) + 1536        'BMP文件大小
        .bfReserved1 = 0                          '保留位
        .bfReserved2 = 0                          '保留位
        .bfOffBits = Len(bf) + Len(bi)            'BMP文件头偏移量
    End With

'设置位图文件存放点阵结构
    With bi
        With .bmiHeader
            .biSize = Len(bi.bmiHeader)           '点阵结构头大小
            .biWidth = 192                'BMP文件宽度
            .biHeight = 64               'BMP文件高度
            .biPlanes = 1                         'BMP文件使用图层数
            .biBitCount = 1                       '设置BMP每像素以一位存储
            .biCompression = 0                    '=0未压缩
            .biSizeImage = 1536           'BMP信息阵列大小
        End With
        .bmiColors(0) = 16777215                  'BMP白色系
        .bmiColors(1) = 0                   'BMP黑色系
    End With
    
'定义用以存放运算后BMP图像的内存缓冲区
    ReDim Buffer(1536 - 1) As Byte

'创建内存设备句柄
    hDc = CreateCompatibleDC(0&)
    
'创建一个与设备无关的内存画图区域(返回值0表示失败,其它为创建区域的句柄)
    hDIB = CreateDIBSection2(hDc, bi, DIB_RGB_COLORS, I, 0&, 0&)

'获取这个区域
    OldObj = SelectObject(hDc, hDIB)

'用API函数对原位图进行光栅运算
    Call BitBlt(hDc, 0&, 0&, bm.bmWidth, bm.bmHeight, Pic.hDc, 0&, 0&, vbSrcCopy)

'从绘图区域取出已绘好之BMP图并放入缓冲区
    Call GetDIBits3(hDc, hDIB, 0, (bm.bmHeight), Buffer(0), bi, 0)
'选取绘图区
    SelectObject hDc, OldObj

'删除内存设备描述句柄
    DeleteDC hDc

'删除创建的绘图区域
    DeleteObject hDIB
    
    On Error Resume Next
'删除原位图
    Err.Number = 0
'释放文件对象
    fp = FreeFile()

'以二进制形式打开一幅位图
    Open FilePathName For Binary As #fp
    
    If Err.Number <> 0 Then
        SaveBmp = Err.Number
        Exit Function
    End If

'写入新位图信息
    Put #fp, 1, bf
    Put #fp, , bi
    Put #fp, , Buffer
    
    Close #fp
    
    Exit Function
    
Err:
    MsgBox Err.Number + Err.Description
End Function

#3


==================================================
所需API函数及结构定义:
'用这个函数删除GDI对象,比如画笔、刷子、字体、位图、区域以及调色板等等。对象使用的所有系统资源都会被释放
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
'----------------------------------------------------------------------------------------------------------
'取得对指定对象进行说明的一个结构。windows手册建议用GetObject这个名字来引用该函数。GetObjectAPI在vb中用于避免 _
 与GetObject关键字混淆
Public Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As _
     Long, lpObject As Any) As Long
'----------------------------------------------------------------------------------------------------------
'删除专用设备场景或信息场景,释放所有相关窗口资源。不要将它用于GetDC函数取回的设备场景
Public Declare Function DeleteDC Lib "gdi32" (ByVal hDc As Long) As Long
'----------------------------------------------------------------------------------------------------------
'将来自一幅位图的二进制位复制到一幅与设备无关的位图里
Public Declare Function GetDIBits3 Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, _
       ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BitMapInfo, ByVal wUsage As Long) As Long
'----------------------------------------------------------------------------------------------------------
'将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容
Public Declare Function 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
'----------------------------------------------------------------------------------------------------------
'创建一个DIBSection。这是一个GDI对象,可象一幅与设备有关位图那样使用。但是,它在内部作为一幅与设备无关位图保存
Public Declare Function CreateDIBSection2 Lib "gdi32" Alias "CreateDIBSection" (ByVal hDc As Long, _
       pBitmapInfo As BitMapInfo, ByVal un As Long, ByVal lplpVoid As Long, ByVal handle As Long, ByVal _
       dw As Long) As Long
'----------------------------------------------------------------------------------------------------------
'创建一个与特定设备场景一致的内存设备场景
Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDc As Long) As Long
'----------------------------------------------------------------------------------------------------------
'每个设备场景都可能有选入其中的图形对象。其中包括位图、刷子、字体、画笔以及区域等等。一次选入设备场景的只能有一 _
 个对象。选定的对象会在设备场景的绘图操作中使用。例如,当前选定的画笔决定了在设备场景中描绘的线段颜色及样式
Public Declare Function SelectObject Lib "gdi32" (ByVal hDc As Long, ByVal hObject As Long) As Long
'----------------------------------------------------------------------------------------------------------
'创建一幅与设备有关位图,它与指定的设备场景兼容
Public Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hDc As Long, ByVal nWidth As Long, ByVal _
       nHeight As Long) As Long
'----------------------------------------------------------------------------------------------------------
'----------------------------------------------------------------------------------------------------------
'关闭系统注册表中的一个项(或键)
Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
'在指定的项下创建一个新项。如指定的项已经存在,那么函数会打开现有的项
Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal _
       lpSubKey As String, phkResult As Long) As Long
'在指定项下创建新项的更复杂的方式。在Win32环境中建议使用这个函数。如指定的项已经存在,则函数会打开现有的项
'Public Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey _
'       As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, _
'       ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, _
'       phkResult As Long, lpdwDisposition As Long) As Long
'删除现有项下方一个指定的子项
Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey _
       As String) As Long
'删除指定项下方的一个值
Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName _
       As String) As Long
'打开一个现有的项。
Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey _
       As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long

'运行指定的程序,返回值Long,大于32表示成功: SW_HIDE 隐藏窗口,活动状态给令一个窗口

Public Declare Function WinExec Lib "kernel32" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long
'常数申明
Public Const DIB_RGB_COLORS = 0&

'BMP文件头结构
Public Type BitMapFileHeader
    bfType             As String * 2       '="BM"
    bfSize             As Long             'BMP文件大头小
    bfReserved1        As Integer          '=0保留位
    bfReserved2        As Integer          '=0保留位
    bfOffBits          As Long             '字节计算
End Type

'BMP位图文件文件信息
Public Type BITMAPINFOHEADER '40 bytes
        biSize           As Long            '=40(&H28)文件头信息大小
        biWidth          As Long            'BMP图象宽度(单位:像素)
        biHeight         As Long            'BMP图象高度(单位:像素)
        biPlanes         As Integer          '=1BMP图像图层数
        biBitCount       As Integer         '=1每像素以一位存储
        biCompression    As Long            '=0未压缩
        biSizeImage      As Long            '=biWidth*biHeight*biBitCount
        biXPelsPerMeter  As Long            '每单位面积上的像素数
        biYPelsPerMeter  As Long            '每单位面积上的像素数
        biClrUsed        As Long
        biClrImportant   As Long
End Type

'单色BMP结构
Public Type BitMapInfo
    bmiHeader         As BITMAPINFOHEADER
    bmiColors(0 To 1) As Long
End Type

Public Type BITMAP '14 bytes
    bmType            As Long
    bmWidth           As Long
    bmHeight          As Long
    bmWidthBytes      As Long
    bmPlanes          As Integer
    bmBitsPixel       As Integer
    bmBits            As Long
End Type

#4


http://www.showyou.net/mycode/CodeView/CodeView_2163.html
非常好用 纯VB代码

项目:JPEG图片压缩程序(1/5)
作者:zyl910
E-Mail:zyl910@sina.com

#5


Saving images to JPG using GDI+ :
http://community.csdn.net/Expert/topic/2684/2684101.xml?temp=.133114

#1


你可以在http://vbaccelerator.com/codelib/gfx/vbjpeg.htm下载一个免费的JPEG控件,该控件提供了SaveJPG函数可以用来保存图像为.jpg格式。如果要转换.bmp文件,可以先将其读入一个Picture控件,再使用SaveJPG函数。如: 
     Dim c As New cDibSection 
     
     picThis.LoadPicture "c:\my\my.bmp" 
     ' 转换Picture对象到DIBSection: 
     c.CreateFromPicture picThis.Picture 
     ' Save it: 
     SaveJPG c, sFileName 

一个处理各种图象格式的站点。包括JPG ,PNG ,MPEG、MP3 等http://www.colosseumbuilders.com/graphicslinks.htm

#2


以前写过些类似的程序,要将大批信息显示在屏幕上,并供投影仪使用。其实就是BMP文件的转换问题。不过不涉及JPG文件格式。
给出部分函数,希望对你的思考有益:

Public Function SaveBmp(Pic As PictureBox, FilePathName$) As Long
'=======================================================================
'  函数功能:从图片框取得一幅颜色格式的位图,并将其转换为黑白格式
'  入口参数:PIC 图片框;FILEPATHAME$ 存放位图路径
'  程序编制:cobra
'  编制时间:2003-06-10
'=======================================================================
    Dim bm                As BITMAP
    Dim SizeOfArry        As Long
    Dim fp                As Long
    Dim bf                As BitMapFileHeader
    Dim bi                As BitMapInfo
    Dim Buffer()          As Byte
    Dim hDc               As Long
    Dim hDIB              As Long
    Dim OldObj            As Long
    Dim I                 As Long
    Dim J                 As Integer
    
'取得BMP位图文件结构
    On Error GoTo Err
    Call GetObject(Pic.Picture, Len(bm), bm)

'取得每条扫描线的字节数(必须是4的倍数)
    SizeOfArry = (((bm.bmWidth / 8 + 3) \ 4) * 4) * bm.bmHeight

'设置要创建的位图的文件头信息
    With bf
        .bfType = "BM"                            'BMP文件识别码
        .bfSize = Len(bf) + Len(bi) + 1536        'BMP文件大小
        .bfReserved1 = 0                          '保留位
        .bfReserved2 = 0                          '保留位
        .bfOffBits = Len(bf) + Len(bi)            'BMP文件头偏移量
    End With

'设置位图文件存放点阵结构
    With bi
        With .bmiHeader
            .biSize = Len(bi.bmiHeader)           '点阵结构头大小
            .biWidth = 192                'BMP文件宽度
            .biHeight = 64               'BMP文件高度
            .biPlanes = 1                         'BMP文件使用图层数
            .biBitCount = 1                       '设置BMP每像素以一位存储
            .biCompression = 0                    '=0未压缩
            .biSizeImage = 1536           'BMP信息阵列大小
        End With
        .bmiColors(0) = 16777215                  'BMP白色系
        .bmiColors(1) = 0                   'BMP黑色系
    End With
    
'定义用以存放运算后BMP图像的内存缓冲区
    ReDim Buffer(1536 - 1) As Byte

'创建内存设备句柄
    hDc = CreateCompatibleDC(0&)
    
'创建一个与设备无关的内存画图区域(返回值0表示失败,其它为创建区域的句柄)
    hDIB = CreateDIBSection2(hDc, bi, DIB_RGB_COLORS, I, 0&, 0&)

'获取这个区域
    OldObj = SelectObject(hDc, hDIB)

'用API函数对原位图进行光栅运算
    Call BitBlt(hDc, 0&, 0&, bm.bmWidth, bm.bmHeight, Pic.hDc, 0&, 0&, vbSrcCopy)

'从绘图区域取出已绘好之BMP图并放入缓冲区
    Call GetDIBits3(hDc, hDIB, 0, (bm.bmHeight), Buffer(0), bi, 0)
'选取绘图区
    SelectObject hDc, OldObj

'删除内存设备描述句柄
    DeleteDC hDc

'删除创建的绘图区域
    DeleteObject hDIB
    
    On Error Resume Next
'删除原位图
    Err.Number = 0
'释放文件对象
    fp = FreeFile()

'以二进制形式打开一幅位图
    Open FilePathName For Binary As #fp
    
    If Err.Number <> 0 Then
        SaveBmp = Err.Number
        Exit Function
    End If

'写入新位图信息
    Put #fp, 1, bf
    Put #fp, , bi
    Put #fp, , Buffer
    
    Close #fp
    
    Exit Function
    
Err:
    MsgBox Err.Number + Err.Description
End Function

#3


==================================================
所需API函数及结构定义:
'用这个函数删除GDI对象,比如画笔、刷子、字体、位图、区域以及调色板等等。对象使用的所有系统资源都会被释放
Public Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long
'----------------------------------------------------------------------------------------------------------
'取得对指定对象进行说明的一个结构。windows手册建议用GetObject这个名字来引用该函数。GetObjectAPI在vb中用于避免 _
 与GetObject关键字混淆
Public Declare Function GetObject Lib "gdi32" Alias "GetObjectA" (ByVal hObject As Long, ByVal nCount As _
     Long, lpObject As Any) As Long
'----------------------------------------------------------------------------------------------------------
'删除专用设备场景或信息场景,释放所有相关窗口资源。不要将它用于GetDC函数取回的设备场景
Public Declare Function DeleteDC Lib "gdi32" (ByVal hDc As Long) As Long
'----------------------------------------------------------------------------------------------------------
'将来自一幅位图的二进制位复制到一幅与设备无关的位图里
Public Declare Function GetDIBits3 Lib "gdi32" Alias "GetDIBits" (ByVal aHDC As Long, ByVal hBitmap As Long, _
       ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BitMapInfo, ByVal wUsage As Long) As Long
'----------------------------------------------------------------------------------------------------------
'将一幅位图从一个设备场景复制到另一个。源和目标DC相互间必须兼容
Public Declare Function 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
'----------------------------------------------------------------------------------------------------------
'创建一个DIBSection。这是一个GDI对象,可象一幅与设备有关位图那样使用。但是,它在内部作为一幅与设备无关位图保存
Public Declare Function CreateDIBSection2 Lib "gdi32" Alias "CreateDIBSection" (ByVal hDc As Long, _
       pBitmapInfo As BitMapInfo, ByVal un As Long, ByVal lplpVoid As Long, ByVal handle As Long, ByVal _
       dw As Long) As Long
'----------------------------------------------------------------------------------------------------------
'创建一个与特定设备场景一致的内存设备场景
Public Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hDc As Long) As Long
'----------------------------------------------------------------------------------------------------------
'每个设备场景都可能有选入其中的图形对象。其中包括位图、刷子、字体、画笔以及区域等等。一次选入设备场景的只能有一 _
 个对象。选定的对象会在设备场景的绘图操作中使用。例如,当前选定的画笔决定了在设备场景中描绘的线段颜色及样式
Public Declare Function SelectObject Lib "gdi32" (ByVal hDc As Long, ByVal hObject As Long) As Long
'----------------------------------------------------------------------------------------------------------
'创建一幅与设备有关位图,它与指定的设备场景兼容
Public Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hDc As Long, ByVal nWidth As Long, ByVal _
       nHeight As Long) As Long
'----------------------------------------------------------------------------------------------------------
'----------------------------------------------------------------------------------------------------------
'关闭系统注册表中的一个项(或键)
Public Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
'在指定的项下创建一个新项。如指定的项已经存在,那么函数会打开现有的项
Public Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal _
       lpSubKey As String, phkResult As Long) As Long
'在指定项下创建新项的更复杂的方式。在Win32环境中建议使用这个函数。如指定的项已经存在,则函数会打开现有的项
'Public Declare Function RegCreateKeyEx Lib "advapi32.dll" Alias "RegCreateKeyExA" (ByVal hKey _
'       As Long, ByVal lpSubKey As String, ByVal Reserved As Long, ByVal lpClass As String, _
'       ByVal dwOptions As Long, ByVal samDesired As Long, lpSecurityAttributes As SECURITY_ATTRIBUTES, _
'       phkResult As Long, lpdwDisposition As Long) As Long
'删除现有项下方一个指定的子项
Public Declare Function RegDeleteKey Lib "advapi32.dll" Alias "RegDeleteKeyA" (ByVal hKey As Long, ByVal lpSubKey _
       As String) As Long
'删除指定项下方的一个值
Public Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName _
       As String) As Long
'打开一个现有的项。
Public Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey _
       As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long

'运行指定的程序,返回值Long,大于32表示成功: SW_HIDE 隐藏窗口,活动状态给令一个窗口

Public Declare Function WinExec Lib "kernel32" (ByVal lpCmdLine As String, ByVal nCmdShow As Long) As Long
'常数申明
Public Const DIB_RGB_COLORS = 0&

'BMP文件头结构
Public Type BitMapFileHeader
    bfType             As String * 2       '="BM"
    bfSize             As Long             'BMP文件大头小
    bfReserved1        As Integer          '=0保留位
    bfReserved2        As Integer          '=0保留位
    bfOffBits          As Long             '字节计算
End Type

'BMP位图文件文件信息
Public Type BITMAPINFOHEADER '40 bytes
        biSize           As Long            '=40(&H28)文件头信息大小
        biWidth          As Long            'BMP图象宽度(单位:像素)
        biHeight         As Long            'BMP图象高度(单位:像素)
        biPlanes         As Integer          '=1BMP图像图层数
        biBitCount       As Integer         '=1每像素以一位存储
        biCompression    As Long            '=0未压缩
        biSizeImage      As Long            '=biWidth*biHeight*biBitCount
        biXPelsPerMeter  As Long            '每单位面积上的像素数
        biYPelsPerMeter  As Long            '每单位面积上的像素数
        biClrUsed        As Long
        biClrImportant   As Long
End Type

'单色BMP结构
Public Type BitMapInfo
    bmiHeader         As BITMAPINFOHEADER
    bmiColors(0 To 1) As Long
End Type

Public Type BITMAP '14 bytes
    bmType            As Long
    bmWidth           As Long
    bmHeight          As Long
    bmWidthBytes      As Long
    bmPlanes          As Integer
    bmBitsPixel       As Integer
    bmBits            As Long
End Type

#4


http://www.showyou.net/mycode/CodeView/CodeView_2163.html
非常好用 纯VB代码

项目:JPEG图片压缩程序(1/5)
作者:zyl910
E-Mail:zyl910@sina.com

#5


Saving images to JPG using GDI+ :
http://community.csdn.net/Expert/topic/2684/2684101.xml?temp=.133114