整体过程是这样的我有个bmp文件,因为空间原因我把它转化成png文件形式存放现在我有个特定大小的picturebox(长和宽都是3615 twip),我的png文件尺寸比这个picturebox大
我完成了png文件显示于picturebox里面,但是由于尺寸问题无法完整显示我尝试用image控件作stretch,但是png文件显示效果比较差我的问题是,如果让一个pgn文件显示于特定大小的picturebox中且不损失图片质量呢?谢谢
我完成了png文件显示于picturebox里面,但是由于尺寸问题无法完整显示我尝试用image控件作stretch,但是png文件显示效果比较差我的问题是,如果让一个pgn文件显示于特定大小的picturebox中且不损失图片质量呢?谢谢
转换为位图之后再??我建议用gdi+的函数直接加载png,然后gdi+的函数再画到控件上
我就是这么干的,但是效果差很多。
发贴后我也作了一些测试,觉得可能我的png缩小后就是细节缺失吧所以我放弃了我的方法
Option ExplicitPrivate 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 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 Declare Function GdipDisposeImage Lib "GdiPlus" (ByVal image As Long) As Long
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 Sub CreateStreamOnHGlobal Lib "ole32.dll" (ByRef hGlobal As Any, ByVal fDeleteOnRelease As Long, ByRef ppstm As Any)
Private Declare Function GdipLoadImageFromStream Lib "GdiPlus" (ByVal Stream As Long, ByRef image As Long) As LongPrivate Type GdiplusStartupInput
GdiplusVersion As Long
DebugEventCallback As Long
SuppressBackgroundThread As Long
SuppressExternalCodecs As Long
End TypePrivate Sub Command1_Click()Dim GpInput As GdiplusStartupInput
Dim token As Long
GpInput.GdiplusVersion = 1
GdiplusStartup token, GpInputDim GdiDC As Long, i() As Byte, StreamObject As Long, img As Long
Dim lngHeight As Long, lngWidth As Long
GdipCreateFromHDC Me.hdc, GdiDC
i = LoadResData(101, "CUSTOM")
' 这个代码是从自定义资源加载的,你可以改成从磁盘加载,自己读png数据流,把字节流数组给 i就行了
' 然后这个代码会把图像显示在窗口左上角
CreateStreamOnHGlobal i(0), 0, StreamObject
GdipLoadImageFromStream StreamObject, img
GdipGetImageHeight img, lngHeight '获取图像高度
GdipGetImageWidth img, lngWidth ' 宽度
Debug.Print lngHeight, lngWidth
GdipDrawImageRect GdiDC, img, 0, 0, lngWidth, lngHeight '这就是画图的语句
GdipDisposeImage img
GdipDeleteGraphics GdiDC
GdiplusShutdown token
End Sub
比如带屏蔽色的位图,用gdi绘图,而不是gdi+, 效果应该不会差太远
你用资源方式打开 XP 的可视化风格文件,就会发现有些图片准备了多个规格的(比如 zune.msstyles 里的 checkbox 图片)。