word右键怎么增加图片另存为
发布时间:2023-11-25 13:26:00
如果我们想把word中的图片保存下来,苦恼word无法使用右键图片另存为,接下来小编就为大家介绍一下如何使用VBA代码增加图片另存为
代码如下:
Option Explicit
Private Const UnitPixel As Long = 2
Private Const EncoderQuality As String = "{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"
Private Type GdiplusStartupInput
GdiplusVersion As Long
DebugEventCallback As Long
SuppressBackgroundThread As Long
SuppressExternalCodecs As Long
End Type
Private Enum EncoderParameterValueType
EncoderParameterValueTypeByte = 1
EncoderParameterValueTypeASCII = 2
EncoderParameterValueTypeShort = 3
EncoderParameterValueTypeLong = 4
EncoderParameterValueTypeRational = 5
EncoderParameterValueTypeLongRange = 6
EncoderParameterValueTypeUndefined = 7
EncoderParameterValueTypeRationalRange = 8
End Enum
Private Type EncoderParameter
GUID(0 To 3) As Long
NumberOfValues As Long
Type As EncoderParameterValueType
Value As Long
End Type
Private Type EncoderParameters
Count As Long
Parameter As EncoderParameter
End Type
Private Type ImageCodecInfo
ClassID(0 To 3) As Long
FormatID(0 To 3) As Long
CodecName As Long
DllName As Long
FormatDescription As Long
FilenameExtension As Long
MimeType As Long
Flags As Long
Version As Long
SigCount As Long
SigSize As Long
SigPattern As Long
SigMask As Long
End Type
Private Declare Function GdiplusStartup Lib "gdiplus" (Token As Long, inputbuf As GdiplusStartupInput, Optional ByVal outputbuf As Long = 0) As Long
Private Declare Sub GdiplusShutdown Lib "gdiplus" (ByVal Token As Long)
Private Declare Function GdipSaveImageToFile Lib "gdiplus" (ByVal hImage As Long, ByVal sFilename As Long, clsidEncoder As Any, encoderParams As Any) As Long
Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal Image 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 GdipGetImageEncodersSize Lib "gdiplus" (numEncoders As Long, Size As Long) As Long
Private Declare Function GdipGetImageEncoders Lib "gdiplus" (ByVal numEncoders As Long, ByVal Size As Long, Encoders As Any) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Declare Function lstrlenW Lib "kernel32" (ByVal psString As Any) As Long
Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpszProgID As Long, pCLSID As Any) As Long
Private Declare Function GdipBitmapSetResolution Lib "gdiplus" (ByVal Bitmap As Long, ByVal xdpi As Single, ByVal ydpi As Single) As Long
Public Enum ImageFileFormat
Bmp = 1
Jpg = 2
Png = 3
Gif = 4
End Enum
Public Function SaveStdPicToFile(Stdpic As StdPicture, ByVal FileName As String, _
Optional ByVal FileFormat As ImageFileFormat = Jpg, _
Optional ByVal JpgQuality As Long = 80, _
Optional Resolution As Single) As Boolean
Dim CLSID(3) As Long
Dim Bitmap As Long
Dim Token As Long
Dim Gsp As GdiplusStartupInput
Gsp.GdiplusVersion = 1 'GDI+ 1.0版本
GdiplusStartup Token, Gsp '初始化GDI+
GdipCreateBitmapFromHBITMAP Stdpic.Handle, Stdpic.hPal, Bitmap
If Bitmap <> 0 Then '说明我们成功的将StdPic对象转换为GDI+的Bitmap对象了
GdipBitmapSetResolution Bitmap, Resolution, Resolution
Select Case FileFormat
Case ImageFileFormat.Bmp
If Not GetEncoderClsID("Image/bmp", CLSID) = -1 Then
SaveStdPicToFile = (GdipSaveImageToFile(Bitmap, StrPtr(FileName), CLSID(0), ByVal 0) = 0)
End If
Case ImageFileFormat.Jpg 'JPG格式可以设置保存的质量
Dim aEncParams() As Byte
Dim uEncParams As EncoderParameters
If GetEncoderClsID("Image/jpeg", CLSID) <> -1 Then
uEncParams.Count = 1 ' 设置自定义的编码参数,这里为1个参数
If JpgQuality < 0 Then
JpgQuality = 0
ElseIf JpgQuality > 100 Then
JpgQuality = 100
End If
ReDim aEncParams(1 To Len(uEncParams))
With uEncParams.Parameter
.NumberOfValues = 1
.Type = EncoderParameterValueTypeLong ' 设置参数值的数据类型为长整型
Call CLSIDFromString(StrPtr(EncoderQuality), .GUID(0)) ' 设置参数唯一标志的GUID,这里为编码品质
.Value = VarPtr(JpgQuality) ' 设置参数的值:品质等级,最高为100,图像文件大小与品质成正比
End With
CopyMemory aEncParams(1), uEncParams, Len(uEncParams)
SaveStdPicToFile = (GdipSaveImageToFile(Bitmap, StrPtr(FileName), CLSID(0), aEncParams(1)) = 0)
End If
Case ImageFileFormat.Png
If Not GetEncoderClsID("Image/png", CLSID) = -1 Then
SaveStdPicToFile = (GdipSaveImageToFile(Bitmap, StrPtr(FileName), CLSID(0), ByVal 0) = 0)
End If
Case ImageFileFormat.Gif
If Not GetEncoderClsID("Image/gif", CLSID) = -1 Then '如果原始的图像是24位,则这个函数会调用系统的调色板来将图像转换为8位,转换的效果会不尽人意,但也有可能系统不自动转换,保存失败
SaveStdPicToFile = (GdipSaveImageToFile(Bitmap, StrPtr(FileName), CLSID(0), ByVal 0) = 0)
End If
End Select
End If
GdipDisposeImage Bitmap '注意释放资源
GdiplusShutdown Token '关闭GDI+。
End Function
Private Function GetEncoderClsID(strMimeType As String, ClassID() As Long) As Long
Dim Num As Long
Dim Size As Long
Dim I As Long
Dim Info() As ImageCodecInfo
Dim Buffer() As Byte
GetEncoderClsID = -1
GdipGetImageEncodersSize Num, Size '得到解码器数组的大小
If Size <> 0 Then
ReDim Info(1 To Num) As ImageCodecInfo '给数组动态分配内存
ReDim Buffer(1 To Size) As Byte
GdipGetImageEncoders Num, Size, Buffer(1) '得到数组和字符数据
CopyMemory Info(1), Buffer(1), (Len(Info(1)) * Num) '复制类头
For I = 1 To Num '循环检测所有解码
If (StrComp(PtrToStrW(Info(I).MimeType), strMimeType, vbTextCompare) = 0) Then '必须把指针转换成可用的字符
CopyMemory ClassID(0), Info(I).ClassID(0), 16 '保存类的ID
GetEncoderClsID = I '返回成功的索引值
Exit For
End If
Next
End If
End Function
Private Function PtrToStrW(ByVal lpsz As Long) As String
Dim Out As String
Dim Length As Long
Length = lstrlenW(lpsz)
If Length > 0 Then
Out = StrConv(String$(Length, vbNullChar), vbUnicode)
CopyMemory ByVal Out, ByVal lpsz, Length * 2
PtrToStrW = StrConv(Out, vbFromUnicode)
End If
End Function
For Each cbn In Array("AutoText", "Drawing Canvas", "Organization Chart", "Diagram", "Frames", "Flowchart", "Inline Picture", "Floating Picture", "Shapes", "Inline Canvas", "Table Pictures", "AutoShapes", "Basic Shapes", "Insert Shape", "Picture", "WordArt Context Menu", "WordArt")


猜你喜欢
- ERP,中文全名是企业资源计划,是一种企业资源管理与业务流程管理的计算机系统,侧重点在于对企业资源的利用、管理和整合。ERP以一项计划为出发
- 在小学使用多媒体课件教学,要使学生不仅学到一定的知识,而且能带着浓厚的兴趣学习,使用课件与学习者之间形成良好的互动,“闯关游戏”课件成为PP
- Mac网页内容阻拦器哪款好用?它可以帮助用户屏蔽广告, * 等,还可以提高 2 倍网页浏览速度,也可以将用户喜爱的网站列入白名单!与 Gho
- Excel中经常需要输入算式计算数据,具体该如何输入算式呢?接下来是小编为大家带来的excel2003输入算式的教程,供大家参考。excel
- 有时候使用软件禁止开机启动项时我们会发现它还是会自己启动,那么如何彻底禁止一些开机启动项呢?XP系统一直无法禁止开机启动项要怎么解决呢?下面
- 微软星期二补丁发布了四个不同的累积更新,分别是kb4022725,kb4022715,kb4022714,和kb4022727,其中Wind
- Win11系统在线升级进度条不动是怎么一回事?最近有用户询问这个问题,Win11统很经常需要更新升级,在线升级进度条不动怎么解决呢?针对这一
- Excel中没有提供直接打印批注的命令,当我们需要只打印批注,而不打印工作表时,可以用下面的方法: 1.
- 一般来说电脑在长时间没有使用的话是是会自动锁屏的,不过有些小伙伴在电脑锁屏的时候可能会遇到用户被锁定无法登录,那么要是遇到这种情况要怎么办呢
- 方法一、同时绘制多条折线:同时选中多行数据→插入折线图,得到多条折线图。方法二、添加数据系列:1、先选中第一行数据,插入折线图。2、右击绘图
- WPS怎么利用模板创建漂亮专业文档?wps中自带了很多模板,想使用模板制作自己需要的文档,该怎么制作呢?下面我们就来看看详细的教程,需要的朋
- win10专业版出现错误代码0x000000d1是怎么回事?其实是因为电脑中的软件与专系统存在冲突,导致出现蓝屏问题,那蓝屏代码0x0000
- LN函数的功能是计算一个数的自然对数,自然对数以常数项e(2.71828182845904)为底。LOG函数的功能是,计算按所指定的底数返回
- 在使用电脑的过程中,如果开放了很多不必要的共享、端口与服务,就会对电脑产生潜在的风险,感染一些病毒等等,所以在不用的时候最好关闭。这里小编就
- 有些浏览器的菜单栏和工具栏上没有保存网页的按钮,无法保存网页,怎么办?很简单,按快捷键。 快捷键:Ctrl+S如图所示: 网页的保存格式:h
- QQ好友恢复系统是QQ的一个功能,可以帮助大家恢复之前3个月内删除的好友。那么qq好友恢复系统的操作方法是怎么样的呢?下面小编给大家详细讲解
- wps文档自动备份在哪里设置?经藏用wps工作,但是怕遇到意外情况导致wps意外关闭,做好的文档就消失了,wps文档怎么设置自动备份呢?下面
- 我们在使用Word中可能需要给表格设置自动编号,让工作效率变得更快捷一些,那么如何给表格设置自动编号呢,接下来由小编为大家推荐Word使用技
- 当我们使用微软操作系统时,有些情况下可能需要我们重新安装或安装操作系统。许多小伙伴都想自己安装操作系统,但不知道该怎么做。根据小编所知,我们
- 怎么把endnote两个数据库合并?endnote中的数据库想要合并,该怎么合并数据库呢?下面我们就来看看endnote两个库合并技巧End