问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

我想用VB写一个压缩图片的程序,应该怎么写

发布网友 发布时间:2022-05-10 17:43

我来回答

4个回答

热心网友 时间:2023-10-06 19:59

如果你是仅仅为了压缩,而不是为了编程,你可以用ACDSee,他可以批量操作,方法是在ACDSee中选择你需要压缩的全部文件,点 工具 调整大小 选项很明显,你试一试。

你非要用程序的话,看看一下参考
注意:
PicClipD的ScaleMode=vbPixels
源图像是ImgSrc
目的图像是PicDest,注意它的属性
最关键的实现过程在CmdMake_Click

将下列内容复制到记事本,并保存为相应的文件

PicScale.vbp
--------------------

Type=Exe
Form=FrmMain.frm
Reference=*\G{00020430-0000-0000-C000-000000000046}#2.0#0#..\..\..\..\WINDOWS\system32\stdole2.tlb#OLE Automation
Object={F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0; COMDLG32.OCX
IconForm="FrmMain"
Startup="FrmMain"
HelpFile=""
ExeName32="PicScale.exe" "
Command32="" "
Name="PicScale"
HelpContextID="0"
CompatibleMode="0"
MajorVer=1
MinorVer=0
RevisionVer=0
AutoIncrementVer=0
ServerSupportFiles=0
CompilationType=0
OptimizationType=0
FavorPentiumPro(tm)=0
CodeViewDebugInfo=0
NoAliasing=0
BoundsCheck=0
OverflowCheck=0
FlPointCheck=0
FDIVCheck=0
UnroundedFP=0
StartMode=0
Unattended=0
Retained=0
ThreadPerObject=0
MaxNumberOfThreads=1

[MS Transaction Server]
AutoRefresh=1

FrmMain.frm
----------------------------------

VERSION 5.00
Object = "{F9043C88-F6F2-101A-A3C9-08002B2F49FB}#1.2#0"; "COMDLG32.OCX"
Begin VB.Form FrmMain
Caption = "简单图像文件缩放"
ClientHeight = 3810
ClientLeft = 165
ClientTop = 855
ClientWidth = 5505
HasDC = 0 'False
LinkTopic = "Form1"
ScaleHeight = 254
ScaleMode = 3 'Pixel
ScaleWidth = 367
StartUpPosition = 3 '窗口缺省
Begin MSComDlg.CommonDialog CDlgFile
Left = 2160
Top = 1320
_ExtentX = 847
_ExtentY = 847
_Version = 393216
End
Begin VB.PictureBox PicClipD
BackColor = &H8000000C&
HasDC = 0 'False
Height = 1695
Left = 2520
ScaleHeight = 109
ScaleMode = 3 'Pixel
ScaleWidth = 117
TabIndex = 8
TabStop = 0 'False
Top = 840
Width = 1815
Begin VB.PictureBox PicDest
AutoRedraw = -1 'True
BackColor = &H00FFFFFF&
BorderStyle = 0 'None
Height = 495
Left = 240
ScaleHeight = 33
ScaleMode = 3 'Pixel
ScaleWidth = 65
TabIndex = 9
TabStop = 0 'False
Top = 360
Width = 975
End
End
Begin VB.PictureBox PicClipS
BackColor = &H8000000C&
HasDC = 0 'False
Height = 1575
Left = 360
ScaleHeight = 101
ScaleMode = 3 'Pixel
ScaleWidth = 101
TabIndex = 7
TabStop = 0 'False
Top = 840
Width = 1575
Begin VB.Image ImgSrc
Height = 855
Left = 240
Top = 240
Width = 855
End
End
Begin VB.PictureBox PicToolBar
Align = 1 'Align Top
HasDC = 0 'False
Height = 495
Left = 0
ScaleHeight = 29
ScaleMode = 3 'Pixel
ScaleWidth = 363
TabIndex = 0
TabStop = 0 'False
Top = 0
Width = 5505
Begin VB.CommandButton CmdReset
Caption = "复位"
Height = 255
Left = 3960
TabIndex = 6
Top = 120
Width = 780
End
Begin VB.CommandButton CmdMake
Caption = "生成"
Height = 255
Left = 3120
TabIndex = 5
Top = 120
Width = 780
End
Begin VB.TextBox TxtHeight
Height = 270
Left = 2280
TabIndex = 4
Text = "Text1"
Top = 120
Width = 750
End
Begin VB.TextBox TxtWidth
Height = 270
Left = 720
TabIndex = 2
Text = "Text1"
Top = 120
Width = 750
End
Begin VB.Label LblHeight
AutoSize = -1 'True
Caption = "Height:"
Height = 180
Left = 1680
TabIndex = 3
Top = 120
Width = 630
End
Begin VB.Label LblWidth
AutoSize = -1 'True
Caption = "&Width:"
Height = 180
Left = 120
TabIndex = 1
Top = 120
Width = 540
End
End
Begin VB.Menu mnuFile
Caption = "文件(&F)"
Begin VB.Menu mnuOpen
Caption = "打开(&O)..."
End
Begin VB.Menu mnuSave
Caption = "保存(&S)..."
End
Begin VB.Menu mnuSep0_0
Caption = "-"
End
Begin VB.Menu mnuExit
Caption = "退出(&X)"
End
End
End
Attribute VB_Name = "FrmMain"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit

Private Const CtlSpace = 4 '控件之间的距离

Private Sub CmdMake_Click()
Dim nWidth As Long
Dim nHeight As Long

'得到数值
On Error GoTo ErrNum
nWidth = CLng(TxtWidth.Text)
nHeight = CLng(TxtHeight.Text)
On Error GoTo 0
If nWidth < 1 Or nHeight < 1 Then GoTo ErrNum

'改变大小
On Error GoTo ErrSetSize
PicDest.Move 0, 0, nWidth, nHeight
On Error GoTo 0

'取消PictureBox的缓存
Set PicDest.Picture = Nothing

'绘制图像
PicDest.PaintPicture ImgSrc, 0, 0, PicDest.ScaleWidth, PicDest.ScaleHeight

Exit Sub

ErrNum:
MsgBox "错误的数值!", vbCritical
Exit Sub

ErrSetSize:
MsgBox "无法创建这么大的图片!", vbCritical
Exit Sub

End Sub

Private Sub CmdReset_Click()
If ImgSrc.Picture.Type = vbPicTypeNone Then '无图片
TxtWidth.Text = CStr(1)
TxtHeight.Text = CStr(1)

CmdMake.Enabled = False

Else
TxtWidth.Text = CStr(ImgSrc.Width)
TxtHeight.Text = CStr(ImgSrc.Height)

CmdMake.Enabled = True

Call CmdMake_Click

End If

End Sub

Private Sub Form_Load()
'-- 初始化坐标定位
Dim SM_Me As Long
Dim SM_Tbr As Long
Dim nTemp As Long

SM_Me = Me.ScaleMode
SM_Tbr = PicToolBar.ScaleMode

'定位PicToolBar的高度
With PicToolBar
'计算边框大小
nTemp = Me.ScaleY(.Height, SM_Me, vbPixels) - .ScaleY(.ScaleHeight, SM_Tbr, vbPixels)
'计算PicToolBar应有高度
nTemp = nTemp + .ScaleY(TxtWidth.Height, SM_Tbr, vbPixels)
'设置高度
.Height = Me.ScaleY(nTemp, vbPixels, SM_Me)
End With

'定位PicToolBar内的控件
nTemp = PicToolBar.ScaleHeight
LblWidth.Move CtlSpace, (nTemp - LblWidth.Height) / 2
TxtWidth.Move LblWidth.Left + LblWidth.Width, 0
LblHeight.Move TxtWidth.Left + TxtWidth.Width + CtlSpace, (nTemp - LblWidth.Height) / 2
TxtHeight.Move LblHeight.Left + LblHeight.Width, 0, TxtHeight.Width, TxtWidth.Height
CmdMake.Move TxtHeight.Left + TxtHeight.Width + CtlSpace, 0, CmdMake.Width, TxtWidth.Height
CmdReset.Move CmdMake.Left + CmdMake.Width + CtlSpace, 0, CmdReset.Width, TxtWidth.Height

ImgSrc.Move 0, 0

PicDest.Move 0, 0

'--设置数值
Call CmdReset_Click

With CDlgFile
.CancelError = True
.Flags = cdlOFNOverwritePrompt Or cdlOFNHideReadOnly
.Filter = "Windows位图(*.bmp)|*.bmp|所有文件(*.*)|*.*"
End With

End Sub

Private Sub Form_Resize()
If Me.WindowState = 1 Then Exit Sub
On Error Resume Next

Dim nTemp As Long
nTemp = PicToolBar.Height
PicClipS.Move 0, nTemp, Me.ScaleWidth / 2, Me.ScaleHeight - nTemp
PicClipD.Move PicClipS.Width, nTemp, Me.ScaleWidth - PicClipS.Width, PicClipS.Height

End Sub

Private Sub mnuExit_Click()
Unload Me
End Sub

Private Sub mnuOpen_Click()
On Error Resume Next

CDlgFile.ShowOpen
If Err.Number Then Exit Sub '点了取消

'打开
Set ImgSrc.Picture = LoadPicture(CDlgFile.FileName)
If Err.Number Then
MsgBox "无法打开文件!", vbCritical
Exit Sub
End If

On Error GoTo 0

Call CmdReset_Click

End Sub

Private Sub mnuSave_Click()
On Error Resume Next

CDlgFile.ShowSave
If Err.Number Then Exit Sub '点了取消

'保存
SavePicture PicDest.Image, CDlgFile.FileName
If Err.Number Then
MsgBox "无法保存图片!", vbCritical
Exit Sub
End If

On Error GoTo 0

End Sub

参考资料:http://topic.csdn.net/t/20040827/14/3315677.html

热心网友 时间:2023-10-06 19:59

如果仅仅是为了压缩图片。
用画笔打开一个几M的图片,保存一下就剩几百K了。
也可以用其它的图片压缩软件。

热心网友 时间:2023-10-06 20:00

用其它格式保存,如JPG
开始 程序 附件 画图 打开 图片 另存为 其他格式

热心网友 时间:2023-10-06 20:00

'---------------------------------------------[压缩图片模块]--------------------------------------------------------------------------------------
Private Declare Function GdiplusStartup Lib "GDIPlus" (token As Long, inputbuf As GdiplusStartupInput, ByVal outputbuf As Long) As Long
Private Declare Function GdiplusShutdown Lib "GDIPlus" (ByVal token As Long) As Long
Private Declare Function GdipCreateBitmapFromHBITMAP Lib "GDIPlus" (ByVal hbm As Long, ByVal hpal As Long, Bitmap As Long) As Long
Private Declare Function GdipDisposeImage Lib "GDIPlus" (ByVal Image As Long) As Long
Private Declare Function GdipSaveImageToFile Lib "GDIPlus" (ByVal Image As Long, ByVal filename As Long, clsidEncoder As GUID, encoderParams As Any) As Long
Private Declare Function CLSIDFromString Lib "ole32" (ByVal str As Long, id As GUID) As Long
Private Declare Function GdipCreateBitmapFromFile Lib "GDIPlus" (ByVal filename As Long, Bitmap As Long) As Long
Private Type GUID
Data1 As Long
Data2 As Integer
Data3 As Integer
Data4(0 To 7) As Byte
End Type
Private Type GdiplusStartupInput
GdiplusVersion As Long
DebugEventCallback As Long
SuppressBackgroundThread As Long
SuppressExternalCodecs As Long
End Type
Private Type EncoderParameter
GUID As GUID
NumberOfValues As Long
type As Long
Value As Long
End Type
Private Type EncoderParameters
Count As Long
Parameter As EncoderParameter
End Type
'---------------------------------------------[压缩图片]--------------------------------------------------------------------------------------
Private Function PictureBoxSaveJPG(ByVal pict As StdPicture, ByVal filename As String, Optional ByVal quality As Byte = 80) As Boolean
Dim tSI As GdiplusStartupInput
Dim lRes As Long
Dim lGDIP As Long
Dim lBitmap As Long
tSI.GdiplusVersion = 1
lRes = GdiplusStartup(lGDIP, tSI, 0)
If lRes = 0 Then
lRes = GdipCreateBitmapFromHBITMAP(pict.Handle, 0, lBitmap)
If lRes = 0 Then
Dim tJpgEncoder As GUID
Dim tParams As EncoderParameters
CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), tJpgEncoder
tParams.Count = 1
With tParams.Parameter ' Quality
CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .GUID
.NumberOfValues = 1
.type = 4
.Value = VarPtr(quality)
End With
lRes = GdipSaveImageToFile(lBitmap, StrPtr(filename), tJpgEncoder, tParams)
GdipDisposeImage lBitmap
End If
GdiplusShutdown lGDIP
End If
If lRes Then
PictureBoxSaveJPG = False
Else
PictureBoxSaveJPG = True
End If
End Function
'---------------------------------------------[压缩图片]--------------------------------------------------------------------------------------
Private Sub Command1_Click()
Dim ret As Boolean
Picture1.Picture = LoadPicture("E:\20100201233117.BMP") '打开要压缩的图片
ret = PictureBoxSaveJPG(Picture1, "E:\20100201233111117.jpg") '保存压缩后的图片
If ret = False Then
MsgBox "保存失败"
End If
End Sub
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
梦见关在拘留所里的人又出了交通事故,是什么意思? ...我朋友前阵子撞死了人,没有违规,当时立即报案了,现在在拘留所... 醉驾出事故,车已经给修了,现在已经进拘留所十多天了,什么时候能判... 朋友因为工地伤亡事故被拘留,现在已经25天了,赔偿金也付了10多天了... 江淮帅铃国4??加油发动机抖动冒黑烟是怎么回事? ...只换机油和格,现在5万公里了,请需要换些什么东西 诗经·国风·中谷有蓷原文、译文以及鉴赏 求解签 情缘 下签 条其啸矣。遇人之不淑矣。 解曰:孽缘遮眼 强栖双... 条其啸矣 如何将域解除? 今天我问我的相亲对象 我们是什么关系 据说吃燕麦能降低心血管病风险,这是真的吗? 我的相亲对象居然是dota美女的内容简介 相亲对象对我很是温柔,是不是对我动了真情呢? 相亲对象是我喜欢的还是父母喜欢的 预防心血管疾病,糖尿病患者要常吃哪些食物? 今天的相亲对象正好是我正在交往的对象,我该高兴呢还是伤心呢? 我的相亲对象,叫我哥哥了,是什么意思 12.图像压缩模型中,源编码器通常包括哪三个子模块? 老婆是我的相亲对象,婚后我还是对她没感觉怎么办? 为什么说餐后血糖能更好地预测糖尿病心血管疾病? 我的相亲对象这样说 我的相亲对象是不是有点不靠谱??? 我的相亲对象很不主动,我应该怎么办? 看看我的相亲对象 血糖高的老年人如何保护心血管 家装时如何挑选合适的装修设计师 有效降低患心血管疾病的危险有哪些方法? 我相亲对象是一个条件不好的人,但说话却很傲慢这样的人好吗? 大家评论一下我的相亲对象是什么样的人?很奇怪很奇葩 谁能帮我把篇文字翻译成英文 如何降低血压动脉硬化等心血管疾病发生? 左侧基底节区腔梗 有助于预防心血管疾病的方法,你知道哪些? 请问有那种软件可以批量压缩图片,并保留图片的exif属性,谢谢。 VGA高清采集卡的测试 右侧基底节区腔梗 关于 右侧基底节区腔梗 请问怎么vb压缩图片,内详 找一部男主角为救女主用狙击*射女鬼,女鬼瞬移到男主角面前要杀男主的电影 小镇人集体变丧尸男主救出女主是什么电影? 有一部电影是男主救了受伤的女主,男主醒来后发现自己被手铐铐在椅子上。 一部美国科幻片,负责巡逻任务得男主救了因故障坠落的飞船的女主,是什么电影? 女主离开来餐厅后,被几个混混抢钱,男主救了女主,一部外国电影? 求一部电影里,电影开始是一对男女座大船出去旅游后来船撞到冰山沉了男主为了救女主自己被冻死了 求一些男主角冒死救女主角的电影电视剧动漫都行。 求一部电影的名字,女主角好像是天使,有翅膀,然后受伤了是男主救了她 求一部美国时空穿梭电影,男主角重复一天的生活,去救女主角,好像是93年拍的 动作电影,最后男主为了救女主,俩人开着失控火车冲到了马路闹市区 是一部关于女主角遭绑架落水失忆被男主角救起的电影。