请教为什么给图片加字后文件大小巨增??

谁为谁狂 2010-09-25 10:02:13

Private Sub Command1_Click()
Set AddwzPic.Picture = LoadPicture("E:\picture1\01EW100925094130GC_C2.JPG")
AddwzPic.CurrentX = 25
AddwzPic.CurrentY = 25
AddwzPic.Print "地点:" & Format(Date, "yyyy年mm月dd日" & " " & Format(Time, "hh:mm:ss"))
SavePicture AddwzPic.Image, "E:\picture1\01EW100925094130GC_C2.JPG"
End Sub

这样之后原本700多K的图片文件一下子变成11.2MB了。怎么才能缩小增加量?
...全文
377 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
谁为谁狂 2010-09-25
  • 打赏
  • 举报
回复
郁闷 楼上的明白我问的是什么吗??????
KillAllCoder 2010-09-25
  • 打赏
  • 举报
回复
bmp就一样大了?
bmp和bmp大小还不一样呢
[Quote=引用 2 楼 photosshop 的回复:]
SavePicture 保存的图像是BMP格式,不是JPG的
与屏幕分辨率没有任何关系。
[/Quote]
谁为谁狂 2010-09-25
  • 打赏
  • 举报
回复
那给图片加字还有其他方法吗?
射天狼 2010-09-25
  • 打赏
  • 举报
回复
你保存之后,图片格式变成BMP了。
谁为谁狂 2010-09-25
  • 打赏
  • 举报
回复
Set AddwzPic.Picture = LoadPicture("E:\picture1\01EW100925094130GC_C2.JPG")

我是用LoadPicture方法加载的JPG格式文件,这样SavePicture的图像还是BMP格式的吗?
PhotosShop 2010-09-25
  • 打赏
  • 举报
回复
SavePicture 保存的图像是BMP格式,不是JPG的
与屏幕分辨率没有任何关系。
KillAllCoder 2010-09-25
  • 打赏
  • 举报
回复
你把你电脑的清晰度调下来就没那么大了.
在桌面右键"属性"->设置->"屏幕分辨率"里调,这个会吧?
楼下的不要回了,说的够明白了.
world_broken 2010-09-25
  • 打赏
  • 举报
回复
最近大牛都回归了,哈哈
用户 昵称 2010-09-25
  • 打赏
  • 举报
回复
变成bmp了。
现在还是人类 2010-09-25
  • 打赏
  • 举报
回复
是你没明白 SavePicture 保存的是什么格式的数据。
不要简单的认为文件扩展名为"JPG"就表示你的数据就是"JPG"格式,
你同样可以用 SavePicture 保存为任何扩展名的文件,比如
SavePicture AddwzPic.Image, "E:\picture1\01EW100925094130GC_C2.TXT"
但是这个文件里的数据还是BMP文件格式的数据,只是扩展名被改动了而已,不相信
你可以用 UE 看一下文件的头数据,坑定是 BM 开头,这就表示是 BMP 的文件格式.
因为 SavePicture 只支持位图、图标、元文件或增强元文件几种格式,
无论你原来的图形是什么格式,他只是从Picture对象里将原有的数据通过自己能编码的方式输出。

这就是解码和编码的过程问题。
你的 LoadPicture 就是解码过程,支持位图 (.bmp) 文件、图标 (.ico) 文件、光标 (.cur) 文件,行程编码 (.rle) 文件、元 (.wmf) 文件、增强的元文件 (.emf), GIF(.gif) 文件以及 JPEG (.jpg) 文件。

你的 SavePicture 就是编码过程,支持位图 (.bmp) 文件、图标 (.ico) 文件、元 (.wmf) 文件、增强的元文件 (.emf)。

如果你想在VB中将位图数据保存成正真的JPG、GIF等格式,有3种方法可以实现
1、用现成的第三方接口,如一些现成的组件、控件、动态函数等
2、用系统自带的函数或库来处理,比如GDI+(也就是GDIPlus)函数
3、自己读写文件进行编码解码的过程,这需要了解相关的图像文件格式和相关的算法

现成的组件可以找一些ASP里用的那种给图像打水印的组件,只用起来很简单,是COM接口的,当然也有API形式的动态连接库。
如:IronSoft 这个组件就很不错,COM形式的,用起来很简单
我的资源里也有一个ImageUtils.dll的东西可以做这块处理,资源地址
http://download.csdn.net/source/427333

在 Windows 2K 以上的系统中都会提供 GDI+ 的支持,所以可以用 GDI+ 的支持函数来做编码转换这一块,
支持的格式也很多,BMP、GIF、TIF、JPG、PNG 等都可以支持,还有层的概念。不过要玩得好,是需要下点功夫,相关的技术文章在CSDN中也有很多,你只要搜索一下就有很多有用的资源供你参考。

在现在的 Windows 图形开发当中,通常只有为了满足特定的需要(比如超大文件或自己的处理过程优于系统过程)或系统不支持的格式才需要自己对文件格式进行处理,要不就是以学习的态度来研究。否着没必要自己去弄这一块。因为这一块需要花费很多功夫去研究格式和算法,然后才到图形显示和自动化对象的处理过程。建议不是弄来玩或是没有足够的技术积累不要考虑这个方案。因为光GIF、JPEG或TIFF这几个文件格式要完全吃透都有可能花费半年到一年时间。更何况还有PNG、WMF、EMF、ICO、CUR、BMP、PIC、PCX等等等等众多的图形格式,都要这么弄,而且要有一定版本和模式的兼容性,的确不容易的。
of123 2010-09-25
  • 打赏
  • 举报
回复
PictureBox 缺省是将文件保存为 bmp 格式。如下保存为 .jpg 即可:

Saving images to JPG using GDI+
This function saves a StdPicture object to a file with JPG format using the GDI+ encoder. Just call the function passing the image object, the filename and, optionally, the image quality (from 1 to 100) .

' ----==== API Declarations ====----

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 Declare Function GdiplusStartup Lib "GDIPlus" ( _
token As Long, _
inputbuf As GdiplusStartupInput, _
Optional ByVal outputbuf As Long = 0) 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

' ----==== SaveJPG ====----

Public Sub SaveJPG( _
ByVal pict As StdPicture, _
ByVal filename As String, _
Optional ByVal quality As Byte = 80)
Dim tSI As GdiplusStartupInput
Dim lRes As Long
Dim lGDIP As Long
Dim lBitmap As Long

' Initialize GDI+
tSI.GdiplusVersion = 1
lRes = GdiplusStartup(lGDIP, tSI)

If lRes = 0 Then

' Create the GDI+ bitmap
' from the image handle
lRes = GdipCreateBitmapFromHBITMAP(pict.Handle, 0, lBitmap)

If lRes = 0 Then
Dim tJpgEncoder As GUID
Dim tParams As EncoderParameters

' Initialize the encoder GUID
CLSIDFromString StrPtr("{557CF401-1A04-11D3-9A73-0000F81EF32E}"), _
tJpgEncoder

' Initialize the encoder parameters
tParams.Count = 1
With tParams.Parameter ' Quality
' Set the Quality GUID
CLSIDFromString StrPtr("{1D5BE4B5-FA4A-452D-9CDD-5DB35105E7EB}"), .GUID
.NumberOfValues = 1
.type = 4
.Value = VarPtr(Quality)
End With

' Save the image
lRes = GdipSaveImageToFile( _
lBitmap, _
StrPtr(Filename), _
tJpgEncoder, _
tParams)

' Destroy the bitmap
GdipDisposeImage lBitmap

End If

' Shutdown GDI+
GdiplusShutdown lGDIP

End If

If lRes Then
Err.Raise 5, , "Cannot save the image. GDI+ Error:" & lRes
End If

End Sub
liquoryellow 2010-09-25
  • 打赏
  • 举报
回复
http://wenku.baidu.com/view/9cb28ed233d4b14e8524683f.html
格式的很容易找到。大小也应该能小些吧。

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧