高分求救(VB不支持中文路径问题)

yz242424 2010-08-27 02:03:25

问题:中文带“美”的中文路径就出错,不带“美”的就可以。
为什么????








pp="d:\美图\1.jpg"
ww="108"
hh="90"
ShowTNImg Picture1, pp, ww, hh








'-------------缩略图函数-----------
Public Function ShowTNImg(pbox As Object, ImagePath As String, WMax As Long, HMax As Long) As ImageInfo
'WMax为最大宽度,HMax为最大高度,这段代码会根据最大宽度和高度调整图片大小。
Dim Wid As Long, Hgt As Long, Top As Long, Left As Long

LoadGDIP

If GdipCreateFromHDC(pbox.hDC, gdip_Graphics) <> 0 Then
MsgBox "出现错误!", vbCritical, "错误"
GdiplusShutdown gdip_Token
End
End If

'载入图片到内存中
GdipLoadImageFromFile StrConv(ImagePath, vbUnicode), gdip_Image

'获取图片长和宽
GdipGetImageWidth gdip_Image, Wid
GdipGetImageHeight gdip_Image, Hgt

With ShowTNImg
.Width = Wid
.Height = Hgt
.FilePath = ImagePath
.FileSize = FileLen(ImagePath) / 1024
.ImageName = Right(ImagePath, Len(ImagePath) - InStrRev(ImagePath, "\"))
.type = Right(ImagePath, Len(ImagePath) - InStrRev(ImagePath, "."))
End With

'智能调整图片大小和留空处理,根据最长边调整
If (Wid > WMax) Or (Hgt > HMax) Then
If Wid > Hgt Then
Hgt = Hgt / Wid * WMax
Wid = WMax
Top = (HMax - Hgt) / 2
Else
Wid = Wid / Hgt * HMax
Hgt = HMax
Left = (WMax - Wid) / 2
End If
Else
Top = (HMax - Hgt) / 2
Left = (WMax - Wid) / 2
End If

'使用GDI+直接从内存中缩略并绘图,GDI+有很好的抗锯齿能力
If GdipDrawImageRect(gdip_Graphics, gdip_Image, Left, Top, Wid, Hgt) <> ok Then
Debug.Print "显示失败。。。"
pbox.ForeColor = vbRed
pbox.DrawWidth = 5
pbox.Line (0, 0)-(pbox.Width, pbox.Height)
pbox.Line (pbox.Width, 0)-(0, pbox.Height)
End If
DisposeGDIP

End Function



...全文
497 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
getemail 2010-09-07
  • 打赏
  • 举报
回复

hefuming5 2010-09-07
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 bcrun 的回复:]
如楼上几位所说,楼主的问题反映出一个普遍的问题:很多人没搞清楚StrConv的具体含义,或是没搞清楚在函数传参,返回值时,与字符串关联的地方应匹配好字符编码方式,就糊里糊涂与这方面的程序,如这个GdipLoadImageFromFile,这样做难保不出错.
[/Quote]
up
VBAdvisor 2010-09-06
  • 打赏
  • 举报
回复

#If Unicode Then
Public Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal Filename As Long, ByRef hImage As Long) As GpStatus
#Else
Public Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal Filename As String, hImage As Long) As GpStatus
#End If

#If Unicode Then
If (GdipLoadImageFromFile(StrPtr(sFilename), hImage) = [Ok]) Then
#Else
If (mGDIplus.GdipLoadImageFromFile(StrConv(sFilename, vbUnicode), hImage) = [Ok]) Then
#End If
倒大霉的上帝 2010-09-06
  • 打赏
  • 举报
回复
书签1
yangguo8013 2010-09-06
  • 打赏
  • 举报
回复
领教了
ysfc_ren 2010-08-31
  • 打赏
  • 举报
回复
不错,学习了
icansaymyabc 2010-08-31
  • 打赏
  • 举报
回复
'载入图片到内存中
GdipLoadImageFromFile( StrConvImagePath, vbUnicode), gdip_Image
改成
GdipLoadImageFromFile StrConv(ImagePath, vbFromUnicode), gdip_Image
试试
  • 打赏
  • 举报
回复
不错,学习一下
bcrun 2010-08-29
  • 打赏
  • 举报
回复
如楼上几位所说,楼主的问题反映出一个普遍的问题:很多人没搞清楚StrConv的具体含义,或是没搞清楚在函数传参,返回值时,与字符串关联的地方应匹配好字符编码方式,就糊里糊涂与这方面的程序,如这个GdipLoadImageFromFile,这样做难保不出错.
liujun4755 2010-08-28
  • 打赏
  • 举报
回复
学习中
zdingyun 2010-08-27
  • 打赏
  • 举报
回复
学习下.
嗷嗷叫的老马 2010-08-27
  • 打赏
  • 举报
回复
顶顶!标记一下!嘿.
lyserver 2010-08-27
  • 打赏
  • 举报
回复
改用GdipDrawImageRect函数就行了,比如:

Option Explicit
Private Type GdiplusStartupInput
GdiplusVersion As Long
DebugEventCallback As Long
SuppressBackgroundThread As Long
SuppressExternalCodecs 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 GdipLoadImageFromFile Lib "gdiplus" (ByVal FileName As Long, hImage As Long) As Long
Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal Image As Long) As Long
Private Declare Function GdipCreateFromHDC Lib "gdiplus" (ByVal hdc As Long, graphics As Long) As Long
Private Declare Function GdipDeleteGraphics Lib "gdiplus" (ByVal graphics As Long) As Long
Private Declare Function GdipDrawImageRectRectI Lib "gdiplus" (ByVal graphics As Long, ByVal hImage As Long, ByVal dstX As Long, ByVal dstY As Long, ByVal dstWidth As Long, ByVal dstHeight As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal SrcWidth As Long, ByVal SrcHeight As Long, ByVal srcUnit As Long, Optional ByVal imageAttributes As Long = 0, Optional ByVal callback As Long = 0, Optional ByVal callbackData As Long = 0) As Long
Private Declare Function GdipDrawImageRect Lib "gdiplus" (ByVal graphics As Long, ByVal Image As Long, ByVal X As Single, ByVal Y As Single, ByVal Width As Single, ByVal Height As Single) As Long
Private Declare Function GdipGetImageWidth Lib "gdiplus" (ByVal Image As Long, Width As Long) As Long
Private Declare Function GdipGetImageHeight Lib "gdiplus" (ByVal Image As Long, Height As Long) As Long
Private Const UnitPixel As Long = &H2&

Private Sub Form_Load()
Me.AutoRedraw = True
DrawPicture Me.hdc, "d:\2.gif", 0, 0, 2.5 '显示比例为2.5倍
End Sub

Private Sub DrawPicture(ByVal hdcDraw As Long, ByVal FileName As String, Optional ByVal nLeft As Long = 0, Optional ByVal nTop As Long = 0, Optional nScale As Double = 1)
Dim hImage As Long
Dim graphics As Long
Dim Token As Long
Dim GdipInput As GdiplusStartupInput
Dim nWidth As Long
Dim nHeight As Long

GdipInput.GdiplusVersion = 1
GdiplusStartup Token, GdipInput
GdipLoadImageFromFile StrPtr(FileName), hImage

GdipGetImageWidth hImage, nWidth
nWidth = nWidth * nScale
GdipGetImageHeight hImage, nHeight
nHeight = nHeight * nScale
GdipCreateFromHDC hdcDraw, graphics
GdipDrawImageRect graphics, hImage, nLeft, nTop, nWidth, nHeight
GdipDeleteGraphics graphics
GdipDisposeImage hImage
GdiplusShutdown Token
End Sub
yz252525 2010-08-27
  • 打赏
  • 举报
回复
回楼上的,你这段代码没有缩略图功能

能不能用我这段代码帮我改一下?
lyserver 2010-08-27
  • 打赏
  • 举报
回复
我试过了,没有问题,我的代码如下:

Option Explicit
Private Type GdiplusStartupInput
GdiplusVersion As Long
DebugEventCallback As Long
SuppressBackgroundThread As Long
SuppressExternalCodecs 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 GdipLoadImageFromFile Lib "gdiplus" (ByVal FileName As Long, hImage As Long) As Long
Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal Image As Long) As Long
Private Declare Function GdipCreateFromHDC Lib "gdiplus" (ByVal hdc As Long, Graphics As Long) As Long
Private Declare Function GdipDeleteGraphics Lib "gdiplus" (ByVal Graphics As Long) As Long
Private Declare Function GdipDrawImageRectRectI Lib "gdiplus" (ByVal Graphics As Long, ByVal hImage As Long, ByVal dstX As Long, ByVal dstY As Long, ByVal dstWidth As Long, ByVal dstHeight As Long, ByVal SrcX As Long, ByVal SrcY As Long, ByVal SrcWidth As Long, ByVal SrcHeight As Long, ByVal srcUnit As Long, Optional ByVal imageAttributes As Long = 0, Optional ByVal callback As Long = 0, Optional ByVal callbackData As Long = 0) As Long
Private Declare Function GdipGetImageWidth Lib "gdiplus" (ByVal Image As Long, Width As Long) As Long
Private Declare Function GdipGetImageHeight Lib "gdiplus" (ByVal Image As Long, Height As Long) As Long
Private Const UnitPixel As Long = &H2&

Private Sub Form_Load()
Me.AutoRedraw = True
DrawPicture Me.hdc, "d:\2.gif"
End Sub

Private Sub DrawPicture(ByVal hdcDraw As Long, ByVal FileName As String, Optional ByVal nLeft As Long = 0, Optional ByVal nTop As Long = 0, Optional ByVal vWidth As Variant, Optional ByVal vHeight As Variant)
Dim hImage As Long
Dim Graphics As Long
Dim Token As Long
Dim GdipInput As GdiplusStartupInput
Dim nWidth As Long
Dim nHeight As Long

GdipInput.GdiplusVersion = 1
GdiplusStartup Token, GdipInput
GdipLoadImageFromFile StrPtr(FileName), hImage
If IsNumeric(vWidth) Then
nWidth = vWidth
Else
GdipGetImageWidth hImage, nWidth
End If
If IsNumeric(vHeight) Then
nHeight = vHeight
Else
GdipGetImageHeight hImage, nHeight
End If
GdipCreateFromHDC hdcDraw, Graphics
GdipDrawImageRectRectI Graphics, hImage, nLeft, nTop, nWidth, nHeight, 0, 0, nWidth, nHeight, UnitPixel, 0, 0, 0
GdipDeleteGraphics Graphics
GdipDisposeImage hImage
GdiplusShutdown Token
End Sub
yz242424 2010-08-27
  • 打赏
  • 举报
回复

回江南春
我是这样声明的
Private Declare Function GdipLoadImageFromFile Lib "GDIPlus" (ByVal filename As String, Image As Long) As GpStatus

但用你的声明
再用你的语句还是出现叉
lyserver 2010-08-27
  • 打赏
  • 举报
回复
如果GdipLoadImageFromFile函数声明如下:
Private Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal FileName As String, hImage As Long) As Long
则直接使用以下语句调用:
GdipLoadImageFromFile ImagePath,gdip_Image
如果声明如下:
Private Declare Function GdipLoadImageFromFile Lib "gdiplus" (ByVal FileName As Long, hImage As Long) As Long
则使用以下语句调用:
GdipLoadImageFromFile strPtr(ImagePath), gdip_Image

LZ这一句是有问题的:
GdipLoadImageFromFile StrConv(ImagePath, vbUnicode), gdip_Image

yz242424 2010-08-27
  • 打赏
  • 举报
回复
不行,还是叉
dafu2003 2010-08-27
  • 打赏
  • 举报
回复
不是VB的问题,是你自己的写法问题。
问题在这:
GdipLoadImageFromFile StrConv(ImagePath, vbUnicode), gdip_Image

GdipLoadImageFromFile 要求的目录的地址,这条应该写成:
GdipLoadImageFromFile strPtr(ImagePath), gdip_Image

yz242424 2010-08-27
  • 打赏
  • 举报
回复
这是缩略图程序

出错是Picture1不出现图片,,出现一个叉
加载更多回复(1)

7,763

社区成员

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

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