VB6打印TIFF图片遇问题:加载时提示invalid Picture错误
解决VB6中TIFF图片加载打印的"invalid Picture"错误
首先得明确问题根源:VB6的LoadPicture函数和原生PictureBox控件不支持TIFF格式——它只对BMP、JPG、GIF、ICO等几种常见格式有原生支持,哪怕是单页TIFF,也可能因为压缩编码(比如LZW)不兼容导致加载失败,更别说多页TIFF了。
下面给你几个实用的解决方案,按推荐程度排序:
方案1:使用Microsoft Imaging Control(最简便)
这是VB6时代专门用来处理TIFF、多页图像的官方控件,支持加载、显示、打印TIFF,步骤如下:
- 打开VB6工程,右键工具箱→部件,勾选「Microsoft Imaging Control 6.0」,点击确定后控件会出现在工具箱里。
- 把这个控件拖到你的窗体上(或者用代码创建),然后用它加载TIFF:
' 假设你添加的控件名叫imgImaging imgImaging.Image = mstrRearTiffImagePath ' 直接加载TIFF文件路径 ' 打印图像 imgImaging.Print ' 如果需要显示到原有的PictureBox里,可以复制图像过去 frmnewimage.img.Picture = imgImaging.Picture
这个控件支持多页TIFF的分页浏览和打印,兼容性很好,唯一要注意的是目标机器需要注册MSIMGCTL.ocx控件(打包安装程序时记得包含它)。
方案2:将TIFF转换为BMP/JPG后再加载
如果不想依赖第三方控件,可以用GDI+ API把TIFF转换成VB6支持的格式(比如BMP),再用LoadPicture加载。下面是简化的实现代码:
' 先声明GDI+核心API(需要添加到模块里) Private Type GdiplusStartupInput GdiplusVersion As Long DebugEventCallback As Long SuppressBackgroundThread As Long SuppressExternalCodecs As Long End Type Private Type GUID Data1 As Long Data2 As Integer Data3 As Integer Data4(0 To 7) As Byte 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 GdipCreateBitmapFromFile Lib "gdiplus" (ByVal filename As String, bitmap As Long) As Long Private Declare Function GdipSaveImageToFile Lib "gdiplus" (ByVal image As Long, ByVal filename As String, clsidEncoder As GUID, encoderParams As Any) As Long Private Declare Function GdipDisposeImage Lib "gdiplus" (ByVal image As Long) As Long ' 获取BMP格式的编码器CLSID(简化处理,直接使用固定值) Private Sub GetBmpEncoderClsid(clsid As GUID) clsid.Data1 = &H557CF400 clsid.Data2 = &H1A0E clsid.Data3 = &H11D3 clsid.Data4(0) = &H9A clsid.Data4(1) = &H73 clsid.Data4(2) = &H00 clsid.Data4(3) = &H00 clsid.Data4(4) = &F8 clsid.Data4(5) = &H1E clsid.Data4(6) = &HF3 clsid.Data4(7) = &H2E End Sub ' 转换TIFF到临时BMP文件的函数 Public Function TiffToBmp(ByVal tiffPath As String, ByVal tempBmpPath As String) As Boolean Dim gdiToken As Long Dim gdiInput As GdiplusStartupInput Dim hImage As Long Dim bmpClsid As GUID ' 初始化GDI+ gdiInput.GdiplusVersion = 1 If GdiplusStartup(gdiToken, gdiInput) <> 0 Then TiffToBmp = False Exit Function End If ' 加载TIFF文件 If GdipCreateBitmapFromFile(tiffPath, hImage) = 0 Then ' 获取BMP编码器CLSID GetBmpEncoderClsid bmpClsid ' 保存为BMP If GdipSaveImageToFile(hImage, tempBmpPath, bmpClsid, ByVal 0&) = 0 Then TiffToBmp = True End If ' 释放图像资源 GdipDisposeImage hImage End If ' 关闭GDI+ GdiplusShutdown gdiToken End Function ' 在你的代码里调用: Dim tempBmp As String tempBmp = Environ("TEMP") & "\temp_tiff.bmp" If TiffToBmp(mstrRearTiffImagePath, tempBmp) Then frmnewimage.img.Picture = LoadPicture(tempBmp) ' 执行打印逻辑 ' 打印完成后删除临时文件 Kill tempBmp End If
这个方法不需要额外控件,但要确保目标机器有gdiplus.dll(Windows XP及以上系统默认自带)。
方案3:直接调用系统打印TIFF文件
如果不需要在PictureBox里预览,只是要打印TIFF,可以直接用ShellExecute调用系统默认的图像查看器来打印:
Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long ' 直接打印TIFF ShellExecute frmnewimage.hwnd, "print", mstrRearTiffImagePath, vbNullString, vbNullString, 0
这个方法最简单,但缺点是无法控制打印参数(比如缩放、页码),完全依赖系统默认程序。
内容的提问来源于stack exchange,提问作者Dinesh
相关产品推荐
相关产品推荐

